替换列中的值时出现错误“尝试在DataFrame的切片副本上设置值”

时间:2019-11-27 07:16:58

标签: python pandas dataframe

如果尝试通过运行以下命令将undefined <failed中的值从usd_pledged_real替换为usd_goal_real,我会尝试:

data.loc[(data['state'] == 'undefined') & (data['usd_pledged_real'] < data['usd_goal_real'])]['state'].replace('undefined', 'failed', inplace=True)

但是,我遇到了这个错误:

/usr/local/lib/python3.6/dist-packages/pandas/core/generic.py:6786: 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/user_guide/indexing.html#returning-a-view-versus-a-copy
  self._update_inplace(new_data)

我的数据集:

enter image description here

1 个答案:

答案 0 :(得分:0)

我认为这里replace是不必要的,因为通过测试undefined根据条件设置值:

m = (data['state'] == 'undefined') & (data['usd_pledged_real'] < data['usd_goal_real'])
data.loc[m,'state'] = 'failed'

如果要使用replace,则必须将输出分配回去。

您不能使用inplace=True,因为子集返回一个Series,其数据可能作为视图。在原位修改它不会始终将其传播回父对象。这就是为什么SettingWithCopyWarning在那里存在的原因(如果设置了该选项,则会加薪)。您不应该这样做,也不应该是他们这样做的理由。

m = (data['state'] == 'undefined') & (data['usd_pledged_real'] < data['usd_goal_real'])
data.loc[m,'state'] = data.loc[m,'state'].replace('undefined', 'failed')

通常不建议使用inplace-link

  

pandas核心团队不鼓励使用 inplace 参数,最终将不推荐使用该参数(这意味着“计划从库中删除”)。原因如下:

     

就地在方法链中不起作用。
  与名称所暗示的相反,使用 inplace 通常不会阻止创建副本。
  删除 inplace 选项将降低熊猫代码库的复杂性。