我已经创建了一个潘达斯数据框架
df = DataFrame(index=['A','B','C'], columns=['x','y'])
并得到这样的结果
x y A NaN NaN B NaN NaN C NaN NaN
x y A NaN NaN B NaN NaN C 10 NaN
用这个代码。
df.xs('C')['x'] = 10
但df
的内容没有变化。在DataFrame中又只有`NaN's。
有什么建议吗?
RukTech'的答案,df.set_value('C', 'x', 10)
,远远快于我下面建议的选项。然而,它已经被[slated for deprecation](https://github.com/pandas-dev/pandas/issues/15269)。
今后,推荐的方法是.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
推荐的方法(根据维护者的说法)是设置一个值。
df.ix['x','C']=10
使用'链式索引'(`df['x']['C'])可能导致问题。
见。