我已经创建了一个熊猫数据框架

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

得到了这个

    x    y
A  NaN  NaN
B  NaN  NaN
C  NaN  NaN

现在,我想给特定的单元格赋值,例如给C行和x列赋值。 我希望得到这样的结果:

    x    y
A  NaN  NaN
B  NaN  NaN
C  10  NaN

下面的代码:

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

但是df的内容没有改变。数据帧仍然只包含nan。

有什么建议吗?


当前回答

这是唯一对我有效的方法!

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

在这里了解有关.loc的更多信息。

其他回答

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

建议的设置方法(根据维护人员)为:

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

使用“链式索引”(df['x']['C'])可能会导致问题。

See:

https://stackoverflow.com/a/21287235/1579844 http://pandas.pydata.org/pandas-docs/dev/indexing.html#indexing-view-versus-copy https://github.com/pydata/pandas/pull/6031

苏,你的问题是将['x',C]的NaN转换为值10

答案是…

df['x'].loc['C':]=10
df

另一种代码是

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

df.loc [' c ', ' x '] = 10 这将改变第c行和 xth列。

使用index with condition的一种方法是首先获取满足条件的所有行的索引,然后简单地以多种方式使用这些行索引

conditional_index = df.loc[ df['col name'] <condition> ].index

示例条件如下

==5, >10 , =="Any string", >= DateTime

然后您可以以各种方式使用这些行索引,例如

替换conditional_index的一列值

df.loc[conditional_index , [col name]]= <new value>

替换conditional_index的多列值

df.loc[conditional_index, [col1,col2]]= <new value>

保存conditional_index的一个好处是,您可以将一个列的值分配给具有相同行索引的另一个列

df.loc[conditional_index, [col1,col2]]= df.loc[conditional_index,'col name']

这一切都是可能的,因为.index返回一个索引数组,.loc可以直接寻址,这样就避免了一次又一次的遍历。