Python pandas:逐行填充数据框

新手上路,请多包涵

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 许可协议

阅读 580
2 个回答

df['y'] 将设置一列

因为你想设置一行,使用 .loc

请注意 .ix 在这里是等效的,你的失败是因为你试图为行的每个元素分配一个字典 y 可能不是你想要的;转换为 Series 会告诉 pandas 您想要对齐输入(例如,您不必指定所有元素)

 In [6]: import pandas as pd

In [7]: df = pd.DataFrame(columns=['a','b','c','d'], index=['x','y','z'])

In [8]: df.loc['y'] = pd.Series({'a':1, 'b':5, 'c':2, 'd':3})

In [9]: df
Out[9]:
     a    b    c    d
x  NaN  NaN  NaN  NaN
y    1    5    2    3
z  NaN  NaN  NaN  NaN

原文由 Jeff 发布,翻译遵循 CC BY-SA 4.0 许可协议

更新:因为 append 已被弃用

df = pd.DataFrame(columns=["firstname", "lastname"])

entry = pd.DataFrame.from_dict({
     "firstname": ["John"],
     "lastname":  ["Johny"]
})

df = pd.concat([df, entry], ignore_index=True)

原文由 fses91 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题