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