在pandas.DataFrame中添加一行

我明白,pandas被devise为加载完全填充的DataFrame但我需要创build一个空的DataFrame,然后逐行添加行 。 什么是最好的方法来做到这一点?

我成功地创build了一个空的DataFrame:

 res = DataFrame(columns=('lib', 'qty1', 'qty2')) 

然后,我可以添加一个新的行,并填写一个字段:

 res = res.set_value(len(res), 'qty1', 10.0) 

它的工作,但似乎很奇怪: – /(它添加string值失败)

我如何添加一个新的行到我的DataFrame(不同的列types)?

@ Nasser的答案示例:

 >>> import pandas as pd >>> df = pd.DataFrame(columns=['lib', 'qty1', 'qty2']) >>> for i in range(5): >>> df.loc[i] = [randint(-1,1) for n in range(3)] >>> >>> print(df) lib qty1 qty2 0 0 0 -1 1 -1 -1 1 2 1 -1 1 3 0 0 0 4 1 -1 -1 [5 rows x 3 columns] 

你可以使用pandas.concat()DataFrame.append() 。 有关详细信息和示例,请参阅合并,联接和连接 。

您可以创build一个字典列表,每个字典对应一个input数据行。 一旦列表完成,然后创build一个数据框。 这是一个更快的方法。

我有一个类似的问题,如果我为每一行创build一个数据框,并将其附加到主数据框,它花了30分钟。 另一方面,如果我使用下面的方法,几秒钟内就能成功。

 rows_list = [] for row in input_rows: dict1 = {} # get input row in dictionary format # key = col_name dict1.update(blah..) rows_list.append(dict1) df = pd.DataFrame(rows_list) 

如果事先知道条目的数量,则应该通过提供索引(从不同的答案中获取数据示例)来预先分配空间:

 import pandas as pd import numpy as np # we know we're gonna have 5 rows of data numberOfRows = 5 # create dataframe df = pd.DataFrame(index=np.arange(0, numberOfRows), columns=('lib', 'qty1', 'qty2') ) # now fill it up row by row for x in np.arange(0, numberOfRows): #loc or iloc both work here since the index is natural numbers df.loc[x] = [np.random.randint(-1,1) for n in range(3)] In[23]: df Out[23]: lib qty1 qty2 0 -1 -1 -1 1 0 0 0 2 -1 0 -1 3 0 -1 0 4 -1 0 0 

速度比较

 In[30]: %timeit tryThis() # function wrapper for this answer In[31]: %timeit tryOther() # function wrapper without index (see, for example, @fred) 1000 loops, best of 3: 1.23 ms per loop 100 loops, best of 3: 2.31 ms per loop 

而且,从评论中可以看出,6000的速度差异变得更大:

增加arrays(12)的大小和行数(500)使速度差异更加显着:313ms vs 2.29s

要有效追加,请参阅如何向“pandas”数据框添加额外的行以及“ 使用放大设置”

不存在的键索引数据上通过loc/ix添加行。 例如:

 In [1]: se = pd.Series([1,2,3]) In [2]: se Out[2]: 0 1 1 2 2 3 dtype: int64 In [3]: se[5] = 5. In [4]: se Out[4]: 0 1.0 1 2.0 2 3.0 5 5.0 dtype: float64 

要么:

 In [1]: dfi = pd.DataFrame(np.arange(6).reshape(3,2), .....: columns=['A','B']) .....: In [2]: dfi Out[2]: AB 0 0 1 1 2 3 2 4 5 In [3]: dfi.loc[:,'C'] = dfi.loc[:,'A'] In [4]: dfi Out[4]: ABC 0 0 1 0 1 2 3 2 2 4 5 4 In [5]: dfi.loc[3] = 5 In [6]: dfi Out[6]: ABC 0 0 1 0 1 2 3 2 2 4 5 4 3 5 5 5 
 mycolumns = ['A', 'B'] df = pd.DataFrame(columns=mycolumns) rows = [[1,2],[3,4],[5,6]] for row in rows: df.loc[len(df)] = row 

您可以使用ignore_index选项将单个行附加为字典。

 >>> f = pandas.DataFrame(data = {'Animal':['cow','horse'], 'Color':['blue', 'red']}) >>> f Animal Color 0 cow blue 1 horse red >>> f.append({'Animal':'mouse', 'Color':'black'}, ignore_index=True) Animal Color 0 cow blue 1 horse red 2 mouse black 

这不是一个OP问题的答案,而是一个玩具的例子来说明@ShikharDua的答案,以上我发现它非常有用。

虽然这个片段是微不足道的,在实际的数据我有1000行和许多列,我希望能够按不同列分组,然后执行多个塔列的统计。 所以有一个可靠的方法来一次一行地构build数据框是非常方便的。 谢谢@ShikharDua!

 import pandas as pd BaseData = pd.DataFrame({ 'Customer' : ['Acme','Mega','Acme','Acme','Mega','Acme'], 'Territory' : ['West','East','South','West','East','South'], 'Product' : ['Econ','Luxe','Econ','Std','Std','Econ']}) BaseData columns = ['Customer','Num Unique Products', 'List Unique Products'] rows_list=[] for name, group in BaseData.groupby('Customer'): RecordtoAdd={} #initialise an empty dict RecordtoAdd.update({'Customer' : name}) # RecordtoAdd.update({'Num Unique Products' : len(pd.unique(group['Product']))}) RecordtoAdd.update({'List Unique Products' : pd.unique(group['Product'])}) rows_list.append(RecordtoAdd) AnalysedData = pd.DataFrame(rows_list) print('Base Data : \n',BaseData,'\n\n Analysed Data : \n',AnalysedData) 

为了Pythonic的方式,在这里添加我的答案:

 res = pd.DataFrame(columns=('lib', 'qty1', 'qty2')) res = res.append([{'qty1':10.0}], ignore_index=True) print(res.head()) lib qty1 qty2 0 NaN 10.0 NaN 

创build一个新的logging(数据框)并添加到old_data_frame
通过列表和相应的名创build一个new_record (data_frame)

 new_record = pd.DataFrame([[0,'abcd',0,1,123]],columns=['a','b','c','d','e']) old_data_frame = pd.concat([old_data_frame,new_record]) 

另一种方法(可能不是很高效):

 # add a row def add_row(df, row): colnames = list(df.columns) ncol = len(colnames) assert ncol == len(row), "Length of row must be the same as width of DataFrame: %s" % row return df.append(pd.DataFrame([row], columns=colnames)) 

您也可以像这样增强DataFrame类:

 import pandas as pd def add_row(self, row): self.loc[len(self.index)] = row pd.DataFrame.add_row = add_row 
 import pandas as pd t1=pd.DataFrame() for i in range(len(the number of rows)): #add rows as columns t1[i]=list(rows) t1=t1.transpose() t1.columns=list(columns) 

简单一点。 通过将列表作为input,将在数据框中作为行添加:

 import pandas as pd res = pd.DataFrame(columns=('lib', 'qty1', 'qty2')) for i in range(5): res_list = list(map(int, input().split())) res = res.append(pd.Series(res_list,index=['lib','qty1','qty2']), ignore_index=True) 

您也可以build立一个列表清单并将其转换为数据框 –

 import pandas as pd rows = [] columns = ['i','double','square'] for i in range(6): row = [i, i*2, i*i] rows.append(row) df = pd.DataFrame(rows, columns=columns) 

    我双广场
 0 0 0 0
 1 1 2 1
 2 2 4 4
 3 3 6 9
 4 4 8 16
 5 5 10 25

这将负责将项目添加到空的DataFrame。 问题是,第一个索引df.index.max()== nan:

 df = pd.DataFrame(columns=['timeMS', 'accelX', 'accelY', 'accelZ', 'gyroX', 'gyroY', 'gyroZ']) df.loc[0 if math.isnan(df.index.max()) else df.index.max() + 1] = [x for x in range(7)]