【发布时间】:2013-06-10 02:47:10
【问题描述】:
向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
那也惨败了。
那么你是怎么做到的呢?
【问题讨论】:
-
请注意,逐行添加数据和大型数据集的效率非常低。相反,首先将数据加载到列表列表中,然后使用
df = pd.DataFrame(data, columns=header)在一行中构造 DataFrame 会快得多 -
为什么在 Lists 中创建数据集效率更高,并且看似将内存中的整个数据集复制为 DataFrame?这在内存使用方面听起来非常低效 - 对于非常庞大的数据集来说可能是一个问题。
-
@xApple,我想你遇到了同样的问题(好几天),我不明白 Columns 和 Index 之间的区别 - 我在考虑数组,这些可以基本上是 row/col 或反之亦然,没有区别。我完全同意你的观点,关于如何使用数据帧以及如何逐行生成 DF(从其他来源读取数据时很典型)的基本理论非常不清楚!
标签: python dataframe row pandas