我创建了一个熊猫数据框
df = DataFrame(index=['A','B','C'], columns=['x','y'])
并得到了这个
x y A NaN NaN B NaN NaN C NaN NaN
现在,我想为特定单元格分配一个值,例如 rowC和 column x。我希望得到这个结果:
C
x
x y A NaN NaN B NaN NaN C 10 NaN
使用此代码:
df.xs('C')['x'] = 10
但是,内容df并没有改变。数据框再次仅包含NaNs。
df
NaN
有什么建议?
df.set_value('C','x', 10)远远快于我在下面建议的选项。但是,它已被 弃用 。
df.set_value('C','x', 10)
展望未来,推荐的方法是.iat/.at.
.iat/.at
为什么df.xs('C')['x']=10不起作用:
df.xs('C')['x']=10
df.xs('C')默认情况下,返回一个带有数据副本的新数据框,所以
df.xs('C')
仅修改此新数据框。
df['x']返回数据框的视图df,因此
df['x']
df['x']['C'] = 10
修改df自己。
警告 :有时很难预测操作是否返回副本或视图。出于这个原因,文档建议避免使用 “chained indexing” 进行分配。
所以推荐的替代方案是
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