【问题标题】:df.loc causes a SettingWithCopyWarning warning messagedf.loc 导致 SettingWithCopyWarning 警告消息
【发布时间】:2017-06-11 17:25:59
【问题描述】:

我的以下代码行会导致警告:

import pandas as pd

s = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))
s.loc[-1] = [5,np.nan,np.nan,6]
grouped = s.groupby(['A'])
for key_m, group_m in grouped:
    group_m.loc[-1] = [10,np.nan,np.nan,10]

C:\Anaconda3\lib\site-packages\ipykernel\__main__.py:10: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

根据documentation,这是推荐的做法,那么发生了什么?

感谢您的帮助。

【问题讨论】:

  • 您需要展示从创建df到这一行的完整代码,以便我们协助

标签: python pandas chained-assignment


【解决方案1】:

文档有点混乱。

您的dataframe 是另一个dataframe 的副本。您可以通过运行 bool(df.is_copy) 来验证这一点。您收到警告是因为您正在尝试分配给此副本。

警告/文档首先告诉您应该如何构造df。现在它是一个副本,而不是你应该如何分配它。

df = some_other_df[cols]

将使df 成为some_other_df 的副本。警告建议改为这样做

df = some_other_df.loc[:, [cols]]

现在已经完成了,如果你选择忽略这个警告,你可以

df = df.copy()

df.is_copy = None

【讨论】:

  • is_copy 已弃用。是否有一种“未来认可”的新技术可供使用?
  • df = df.copy() 应该可以正常工作。我个人避免就地编辑数据框。每次转换都会产生一个新副本,我会在需要时覆盖旧副本。
猜你喜欢
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
  • 2010-12-17
相关资源
最近更新 更多