更改DataFrame最后一行的元素

31 投票
3 回答
63014 浏览
提问于 2025-04-18 16:14

我在pandas中设置了一个简单的数据框(DataFrame):

a = pandas.DataFrame([[1,2,3], [4,5,6], [7,8,9]], columns=['a','b','c'])
>>> print a
   a  b  c
0  1  2  3
1  4  5  6
2  7  8  9

我想修改最后一行的一个元素。在pandas版本0.13.1中,我可以用以下方法:

a.iloc[-1]['a'] = 77
>>> print a
    a  b  c
0   1  2  3
1   4  5  6
2  77  8  9

但是在更新到pandas版本0.14.1后,当我这样做时,会出现以下警告:

SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead

问题是,-1并不是的索引,所以我不能使用loc。正如警告所说,我并没有改变最后一行的'a'列,只是修改了一个被丢弃的本地副本。

那么在新版的pandas中,我该怎么做呢?我知道我可以用最后一行的索引,比如:

a.loc[2,'a'] = 77

但我会处理一些表格,其中多行有相同的索引,我不想每次都重新索引我的表格。有没有办法在不知道最后一行索引的情况下做到这一点呢?

3 个回答

11

对于pandas 0.22来说,

a.at[a.index[-1], 'a'] = 77

这只是其中一种方法。

38

结合@PallavBakshi和@Mike的解决方案,下面的代码在Pandas版本0.19及以上可以正常运行:

a.loc[a.index[-1], 'a'] = 4.0

直接使用 iloc[-1, 'a'] 是不行的,因为'a'并不是一个位置。

33

好的,我找到了一种方法来解决这个问题,不需要使用链式操作,也不用担心多个索引。

a.iloc[-1, a.columns.get_loc('a')] = 77
>>> a
   a  b  c
0  1  2  3
1  4  5  6
2 77  8  9

之前我不能使用 iloc 是因为我不能把列的索引作为整数提供,但 get_loc 解决了这个问题。感谢大家的有用评论!

撰写回答