更改 DataFrame 的最后一行中的元素
Posted
技术标签:
【中文标题】更改 DataFrame 的最后一行中的元素【英文标题】:Change an element in the last row of a DataFrame 【发布时间】:2014-09-29 09:19:31 【问题描述】:我在 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不是a
的索引,所以我不能使用loc
。正如警告所示,我没有更改最后一行的'a'
列,我只更改了丢弃的本地副本。
如何在新版本的 pandas 中执行此操作?我意识到我可以使用最后一行的索引,例如:
a.loc[2,'a'] = 77
但我将使用多行具有相同索引的表,并且我不想每次都重新索引我的表。有没有办法在事先不知道最后一行的索引的情况下做到这一点?
【问题讨论】:
你可以使用a.ix[-1,'a'] = 77
或a.loc[a.index[-1],'a'] = 77
@Jeff first code sn-p a.ix[-1,'a'] = 77
插入一个索引值为 -1 的新行:-1 77 NaN NaN
,但我确实发现这可行:df.iloc[-1].ix['a'] = 77
@Jeff a.index[-1]
返回最后一行的索引,但如果我有多行的索引,它也会返回那些。我收到a.ix[-1, 'a']
的错误。
@EdChum 不要链接索引!
@MikeP。如果你有重复,那么你需要使用.append
,或者做某种groupby
来消除它们
【参考方案1】:
好的,我找到了一种无需链接且无需担心多个索引即可解决此问题的方法。
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
,因为我无法将列索引提供为int,但get_loc
解决了这个问题。感谢大家的帮助!
【讨论】:
在 pandas 0.19.1 中,这种方法会发出警告 SettingWithCopyWarning: A value is trying to be set on a slice of a slice from DataFrame。尝试改用 .loc[row_indexer,col_indexer] = value【参考方案2】:从@PallavBakshi 和@Mike 的解决方案中获取元素,以下在 Pandas 中的工作 >= 0.19
仅使用 iloc[-1, 'a] 不起作用,因为 -1 不在索引中。
a.loc[a.index[-1], 'a']= 4.0
【讨论】:
【参考方案3】:对于熊猫 0.22,
a.at[a.index[-1], 'a'] = 77
这只是其中一种方式。
【讨论】:
以上是关于更改 DataFrame 的最后一行中的元素的主要内容,如果未能解决你的问题,请参考以下文章
pyspark中的RDD到DataFrame(来自rdd的第一个元素的列)
pandas删除数据行中的重复数据行基于dataframe所有列删除重复行基于特定数据列或者列的作何删除重复行删除重复行并保留重复行中的最后一行pandas删除所有重复行(不进行数据保留)