向 pandas.DataFrame
对象添加一行的简单任务似乎很难完成。有 3 个与此相关的 stackoverflow 问题,没有一个给出有效的答案。
这是我正在尝试做的。我有一个 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
现在,我有一个函数可以迭代计算行的值。如何用字典或 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
那也惨败。
你是怎么做到的 ?
原文由 xApple 发布,翻译遵循 CC BY-SA 4.0 许可协议
df['y']
将设置一列因为你想设置一行,使用
.loc
请注意
.ix
在这里是等效的,你的失败是因为你试图为行的每个元素分配一个字典y
可能不是你想要的;转换为 Series 会告诉 pandas 您想要对齐输入(例如,您不必指定所有元素)