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

2024-03-29 11:45:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经创建了一个Pandas数据框

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的内容没有改变。在DataFrame中也只有NaNs。

有什么建议吗?


Tags: columns数据代码内容dataframepandasdfindex
3条回答

RukTech's answerdf.set_value('C', 'x', 10)比我下面建议的选项快得多。然而,它一直是slated for deprecation

向前看,recommended method is ^{}


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

df.xs('C')默认情况下,返回数据的新数据帧,因此

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

仅修改此新数据框。

df['x']返回数据帧的视图,因此

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

修改df本身。

警告:有时很难预测操作是否返回副本或视图。因此docs recommend avoiding assignments with "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

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


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

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

也可以使用.loc进行条件查找,如下所示:

df.loc[df[<some_column_name>] == <condition>, [<another_column_name>]] = <value_to_add>

其中<some_column_name是要检查<condition>变量的列,而<another_column_name>是要添加到的列(可以是新列或已存在的列)。<value_to_add>是要添加到该列/行的值。

这个例子并不能很好地解决手头的问题,但是对于希望根据条件添加特定值的人来说,它可能是有用的。

相关问题 更多 >