更改DataFrame最后一行的元素
我在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
解决了这个问题。感谢大家的有用评论!