【问题标题】:Pandas SettingWithCopyWarning when using iloc使用 iloc 时的 Pandas SettingWithCopyWarning
【发布时间】: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']) 中断怎么办?

【问题讨论】:

  • 有类似的问题。确实看到了,不高兴,我的目的是更新值,而不是创建数据框的副本并保持原样。另外:我的 .iloc 来自 grp_kfold.split,所以我只有数字,不能做 df.A=x

标签: python pandas


【解决方案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,那么您忘记制作副本并最终导致一个令人讨厌的错误...

    【讨论】:

      猜你喜欢
      • 2014-10-18
      • 2016-10-16
      • 2016-10-21
      • 2017-12-19
      • 2021-11-20
      • 2014-12-30
      • 1970-01-01
      相关资源
      最近更新 更多