使用 iloc 时的 Pandas SettingWithCopyWarning

Posted

技术标签:

【中文标题】使用 iloc 时的 Pandas SettingWithCopyWarning【英文标题】:Pandas SettingWithCopyWarning when using iloc 【发布时间】:2017-07-16 06:07:14 【问题描述】:

在将我的 DataFrame 与另一个 DataFrame 合并后,我尝试更改其值并遇到一些问题(在合并之前似乎不是问题)。

我正在索引和更改我的 DataFrame 中的值:

df.iloc[0]['column'] = 1

随后,我使用合并沿两个索引加入(左外连接)(我意识到 left.join(right) 也可以)。之后,当我使用 iloc 执行相同的值分配时,我收到以下警告:

__main__:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

对链接文档的审查并没有阐明理解,因此,我是否使用了不正确的 iloc 切片方法? (请记住,出于代码的目的,我需要基于位置的切片)

我注意到 df.ix[0,'column'] = 1 有效,同样基于this page 我可以使用 df.columns.get_loc('column') 引用列位置,但表面上这似乎不必要的复杂。

这些方法在底层有什么区别,合并会导致之前的方法 (df.iloc[0]['column']) 中断怎么办?

【问题讨论】:

在这里查看答案***.com/questions/25489875/… 有类似的问题。确实看到了,不高兴,我的目的是更新值,而不是创建数据框的副本并保持原样。另外:我的 .iloc 来自 grp_kfold.split,所以我只有数字,不能做 df.A=x 【参考方案1】:

您在上面使用链式索引,这是要避免的“df.iloc[0]['column'] = 1”并生成您收到的 SettingWithCopy 警告。 Pandas 文档有点复杂,但请参阅SettingWithCopy Warning with chained indexing,了解为什么这不起作用。

你应该使用df.loc[0, 'column'] = 1

.loc 用于“通过标签或布尔数组访问一组行和列。”

.iloc 用于“用于按位置选择的纯整数位置索引”。

【讨论】:

【参考方案2】:

这很糟糕,但是到目前为止,关于基于 .ilocs更新数据框列的最佳解决方案是找到列的 iloc,然后对所有内容使用 .iloc:

column_i_loc = np.where(df.columns == 'column')[0][0] df.iloc[0, column_i_loc] = 1

请注意,您也可以禁用警告,但实际上不要!...

此外,如果您遇到此警告并且没有尝试更新某些原始 DataFrame,那么您忘记制作副本并最终导致一个令人讨厌的错误...

【讨论】:

以上是关于使用 iloc 时的 Pandas SettingWithCopyWarning的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:使用 .iloc 对多列求和,但也包括绝对值

iloc[ ]函数(Pandas库)

使用 iloc 为 pandas DataFrame 中的特定单元格设置值

即使在 Pandas 中使用 .iloc 也会出现索引越界错误

快速学会pandas中Dataframe索引.ix,.iloc,.loc的使用以及区别

pandas使用iloc函数将dataframe的所有数据行反序(reverse the order of rows in dataframe)