【问题标题】:Contradictory pandas.DataFrame behavior when assigning value to a column为列赋值时矛盾的 pandas.DataFrame 行为
【发布时间】:2020-04-27 15:20:44
【问题描述】:

我有以下数据框:

df3.head()

2005-02-23       NaN       NaN
2005-02-24  0.888447  2.260956
2005-03-24 -1.616620       NaN
2005-04-12       NaN       NaN
2005-04-28  0.233408 -2.340463

如果我运行以下几行:

df4 = df3.dropna(thresh=2).rename(columns={'a': 'x', 'b': 'y'})

df4['c'] = 1

代码在没有警告的情况下执行。但是,如果我改为运行以下行:

df4 = df3.dropna(thresh=2) #.rename(columns={'a': 'x', 'b': 'y'})

df4['c'] = 1

我收到警告消息:

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

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

这是怎么回事?

我可以按照它的建议通过使用loc 来消除警告:

df4 = df3.dropna(thresh=2) #.rename(columns={'a': 'x', 'b': 'y'})

df4.loc[:, 'c'] = 1

但是,这个解决方案很棘手,因为参考列 c 在使用 loc 时不存在。

熊猫版本:0.23.4

【问题讨论】:

  • 对内部 pandas 的了解不足以解释,该警告只是想警告您 df4['c'] = 1 有时会设置在 df 的副本上,当您的 df 仍然有 #NA 时,这总是向我显示我认为,对于这种情况,我认为它仍然会成功地做你想做的事
  • 我无法使用 pandas 0.25.3 版重现此问题,此处没有警告

标签: python pandas dataframe


【解决方案1】:

警告有点解释它

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

当使用df[col] = value 进行分配时,pandas 会在后台进行复制,我认为这会导致内存问题,因此会出现警告。

但是,使用 loc 您指定要更改的行,因此不会复制,只是更新

阅读更多here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多