Pythonpandas:逐行填充dataframe

将一行添加到pandas.DataFrame对象的简单任务似乎很难完成。 有3个与此相关的stackoverflow问题,没有一个给出了一个工作的答案。

这是我想要做的。 我有一个DataFrame我已经知道的形状以及行和列的名称。

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

现在,我有一个函数来迭代计算行的值。 我怎样才能用字典或pandas.Series来填充其中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) abcd 0 NaN NaN NaN NaN 1 NaN NaN NaN NaN 2 NaN NaN NaN NaN 3 1 5 2 3 

它确实将列名与值alignment,但是丢失了行标签。

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

这也失败了。

你是怎么做到的 ?

df['y']将设置一个列

既然你想设置一个行,使用.loc

注意.ix在这里是等价的,你的失败是因为你试图给行的每个元素分配一个字典y可能不是你想要的; 转换为一个系列告诉大pandas,你想alignmentinput(例如,你不必指定所有的元素)

 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]: abcd x NaN NaN NaN NaN y 1 5 2 3 z NaN NaN NaN NaN 

我的方法是,但我不能保证这是最快的解决scheme。

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

这是一个更简单的版本

 df = 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>']` 

如果你的input行是列表而不是字典,那么下面是一个简单的解决scheme:

 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']) # ABC # 0 1 2 3 # 1 4 5 6