使用索引为 pandas DataFrame 中的特定单元格设置值

新手上路,请多包涵

我创建了一个 Pandas DataFrame

 df = DataFrame(index=['A','B','C'], columns=['x','y'])

并得到了这个

    xy
一个南南
B南南
C南南南

现在,我想为特定单元格分配一个值,例如行 C 和列 x 。我希望得到这个结果:

    xy
一个南南
B南南
C 10 南

使用此代码:

 df.xs('C')['x'] = 10

但是, df 的内容没有改变。数据框再次仅包含 NaN s。

有什么建议么?

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

阅读 329
2 个回答

RukTech 的答案 df.set_value('C', 'x', 10) 比我在下面建议的选项快得多。但是,它已被 预定弃用

展望未来, 推荐的方法是 .iat/.at


为什么 df.xs('C')['x']=10 不起作用:

df.xs('C') 默认情况下,返回一个 带有数据副本 的新数据框,所以

df.xs('C')['x']=10

仅修改此新数据框。

df['x'] 返回 df 数据帧的视图,所以

df['x']['C'] = 10

修改 df 本身。

警告:有时很难预测操作返回的是副本还是视图。出于这个原因, 文档建议避免使用“链式索引”进行分配


所以推荐的替代方案是

df.at['C', 'x'] = 10

确实 修改 df


 In [18]: %timeit df.set_value('C', 'x', 10)
100000 loops, best of 3: 2.9 µs per loop

In [20]: %timeit df['x']['C'] = 10
100000 loops, best of 3: 6.31 µs per loop

In [81]: %timeit df.at['C', 'x'] = 10
100000 loops, best of 3: 9.2 µs per loop

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

更新: .set_value 方法将被 弃用.iat/.at 是很好的替代品,不幸的是 pandas 提供的文档很少


最快的方法是使用 set_value 。此方法比 .ix 方法快约 100 倍。例如:

df.set_value('C', 'x', 10)

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

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