问题

我创建了一个Pandas DataFrame

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

得到这个

    x    y
A  NaN  NaN
B  NaN  NaN
C  NaN  NaN


2001年12月31日终了的两年期收入和支出及准备金和基金结余变动报表 然后我想将值分配给特定的单元格,例如行’C’和列’x’. 我预计会得到这样的结果:

    x    y
A  NaN  NaN
B  NaN  NaN
C  10  NaN

使用此代码:

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

但是df的内容没有改变.它在DataFrame中再次只有NaN.

有什么建议?

  最佳答案

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
 

  相同标签的其他问题

pythonpandasdataframe