Python pandas: เติมดาต้าเฟรมทีละแถว


133

งานง่ายๆในการเพิ่มแถวให้กับpandas.DataFrameวัตถุดูเหมือนจะทำได้ยาก มีคำถามเกี่ยวกับ stackoverflow 3 คำถามซึ่งไม่มีคำถามใดให้คำตอบที่ใช้ได้

นี่คือสิ่งที่ฉันพยายามทำ ฉันมี DataFrame ซึ่งฉันรู้จักรูปร่างตลอดจนชื่อของแถวและคอลัมน์แล้ว

>>> df = pandas.DataFrame(columns=['a','b','c','d'], index=['x','y','z'])
>>> df
     a    b    c    d
x  NaN  NaN  NaN  NaN
y  NaN  NaN  NaN  NaN
z  NaN  NaN  NaN  NaN

ตอนนี้ฉันมีฟังก์ชั่นในการคำนวณค่าของแถวซ้ำ ๆ ฉันจะกรอกหนึ่งในแถวด้วยพจนานุกรมหรือ a pandas.Series? ความพยายามต่างๆที่ล้มเหลวมีดังนี้

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df['y'] = y
AssertionError: Length of values does not match length of index

เห็นได้ชัดว่ามันพยายามเพิ่มคอลัมน์แทนแถว

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.join(y)
AttributeError: 'builtin_function_or_method' object has no attribute 'is_unique'

ข้อความแสดงข้อผิดพลาดที่ไม่เป็นข้อมูลมาก

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.set_value(index='y', value=y)
TypeError: set_value() takes exactly 4 arguments (3 given)

เห็นได้ชัดว่ามีไว้สำหรับการตั้งค่าแต่ละค่าในดาต้าเฟรมเท่านั้น

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.append(y)
Exception: Can only append a Series if ignore_index=True

ฉันไม่ต้องการเพิกเฉยต่อดัชนีมิฉะนั้นนี่คือผลลัพธ์:

>>> df.append(y, ignore_index=True)
     a    b    c    d
0  NaN  NaN  NaN  NaN
1  NaN  NaN  NaN  NaN
2  NaN  NaN  NaN  NaN
3    1    5    2    3

มันจัดตำแหน่งชื่อคอลัมน์ให้สอดคล้องกับค่า แต่ทำให้ป้ายชื่อแถวหายไป

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.ix['y'] = y
>>> df
                                  a                                 b  \
x                               NaN                               NaN
y  {'a': 1, 'c': 2, 'b': 5, 'd': 3}  {'a': 1, 'c': 2, 'b': 5, 'd': 3}
z                               NaN                               NaN

                                  c                                 d
x                               NaN                               NaN
y  {'a': 1, 'c': 2, 'b': 5, 'd': 3}  {'a': 1, 'c': 2, 'b': 5, 'd': 3}
z                               NaN                               NaN

นั่นก็ล้มเหลวอย่างน่าอนาถ

แล้วคุณจะทำอย่างไร?

คำตอบ:


92

df['y'] จะตั้งค่าคอลัมน์

เนื่องจากคุณต้องการตั้งค่าแถวให้ใช้ .loc

โปรดทราบว่าที่.ixนี่เทียบเท่าคุณล้มเหลวเนื่องจากคุณพยายามกำหนดพจนานุกรมให้กับแต่ละองค์ประกอบของแถวyอาจไม่ใช่สิ่งที่คุณต้องการ การแปลงเป็นซีรี่ส์จะบอกแพนด้าว่าคุณต้องการจัดแนวอินพุต (เช่นคุณไม่จำเป็นต้องระบุองค์ประกอบทั้งหมด)

In [7]: df = pandas.DataFrame(columns=['a','b','c','d'], index=['x','y','z'])

In [8]: df.loc['y'] = pandas.Series({'a':1, 'b':5, 'c':2, 'd':3})

In [9]: df
Out[9]: 
     a    b    c    d
x  NaN  NaN  NaN  NaN
y    1    5    2    3
z  NaN  NaN  NaN  NaN

ฉันเห็น. ดังนั้นlocแอตทริบิวต์ของ data frame จึงกำหนดความพิเศษ__setitem__ที่ใช้เวทมนตร์ที่ฉันคิด
xApple

คุณสามารถสร้างสิ่งนี้ในครั้งเดียว (เช่นคอลัมน์ดัชนีและ y) ได้หรือไม่?
Andy Hayden

5
ดังนั้นหากฉันสามารถสร้างทีละแถวฉันจะสร้าง data frame ให้เหมาะสมที่สุดได้อย่างไร
xApple

คาดหวังว่าจะมีรูปแบบdf = pd.DataFrame({'y': pd.Series(y)}, columns=['a','b','c','d'], index=['x','y','z'])การทำงานบางอย่างหรือไม่?
Andy Hayden

@xApple prob ดีที่สุดสำหรับคุณในการสร้างรายการคำสั่ง (หรือรายการ) จากนั้นส่งผ่านไปยังตัวสร้างจะมีประสิทธิภาพมากขึ้น
Jeff

71

แนวทางของฉันคือ แต่ฉันไม่สามารถรับประกันได้ว่านี่เป็นวิธีแก้ปัญหาที่เร็วที่สุด

df = pd.DataFrame(columns=["firstname", "lastname"])
df = df.append({
     "firstname": "John",
     "lastname":  "Johny"
      }, ignore_index=True)

4
สิ่งนี้ใช้ได้ผลดีสำหรับฉันและฉันชอบความจริงที่ว่าคุณappendนำข้อมูลไปยัง dataframe อย่างชัดเจน
Jonny Brooks

1
โปรดทราบว่าคำตอบนี้ต้องการให้แต่ละแถวต่อท้ายชื่อคอลัมน์ เหมือนกันสำหรับคำตอบที่ยอมรับ
pashute

วิธีนี้ได้ผลเช่นกันหากคุณไม่ทราบจำนวนแถวล่วงหน้า
irene

34

นี่เป็นเวอร์ชันที่เรียบง่ายกว่า

import pandas as pd
df = pd.DataFrame(columns=('col1', 'col2', 'col3'))
for i in range(5):
   df.loc[i] = ['<some value for first>','<some value for second>','<some value for third>']`

4
แค่อยากถามว่า CPU และหน่วยความจำนี้มีประสิทธิภาพหรือไม่?
czxttkl

1
ฉันจะรู้ได้อย่างไรว่าแถวสุดท้ายของ df ดังนั้นฉันจึงต่อท้ายแถวสุดท้ายทุกครั้ง
pashute

25

หากแถวป้อนข้อมูลของคุณเป็นรายการแทนที่จะเป็นพจนานุกรมวิธีแก้ไขปัญหาต่อไปนี้ทำได้ง่ายๆ:

import pandas as pd
list_of_lists = []
list_of_lists.append([1,2,3])
list_of_lists.append([4,5,6])

pd.DataFrame(list_of_lists, columns=['A', 'B', 'C'])
#    A  B  C
# 0  1  2  3
# 1  4  5  6

แต่ฉันจะทำอย่างไรถ้าฉันมีดัชนีหลายตัว? df1 = pd.DataFrame (list_of_lists, คอลัมน์ ['A', 'B', 'C'], index = ['A', 'B']) ไม่ทำงาน รูปร่างผิด ดังนั้นวิธีการที่?
pashute
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.