Python pandas 删除 SettingWithCopyWarning

Posted

技术标签:

【中文标题】Python pandas 删除 SettingWithCopyWarning【英文标题】:Python pandas removing SettingWithCopyWarning 【发布时间】:2014-02-28 21:50:28 【问题描述】:

所以我使用了一个空数据框

df=data[['ID','Matrix','Name','Country', 'Units']]
df['Value']=''

我正在用这样的代码填充它,它会在 df.Matrix 中找到包含“好”、“坏”值的字符串,并用 sch[i] 中的值填充它们:

df.loc[df.Matrix.str.contains('Good'),'Value'] = sch[2]
df.loc[df.Matrix.str.contains('Bad'),'Value'] = sch[6]
df.loc[df.Matrix.str.contains('Excellent'),'Value'] = sch[8]

我遇到了一堆错误,比如这两个不同的错误:

C:\Python33\lib\site-packages\pandas\core\strings.py:184: UserWarning: This pattern has match groups. To actually get the groups, use str.extract.
  " groups, use str.extract.", UserWarning)

C:\Users\0\Desktop\python\Sorter.py:57: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame
  df.loc[df.Matrix.str.contains('Bad'),'Value'] = sch[6]

到目前为止,我正在使用

来抑制代码
pd.options.mode.chained_assignment = None

如果我不抑制错误消息,我将收到大约 20 条错误消息。是否有其他格式可以更改数据,以免收到错误消息?

如果有帮助,我正在使用 python 3 和 pandas 0.131

【问题讨论】:

【参考方案1】:

这里很好地解释了为什么这个警告被打开:

Pandas: Chained assignments

您确定这就是您的全部代码吗?请展示你正在做的所有事情。

In [13]: df = DataFrame(index=range(5))

In [14]: df['Value'] = ''

In [15]: df.loc[[1,4],'Value'] = 'bad'

In [16]: df.loc[[0,3],'Value'] = 'good'

In [17]: df
Out[17]: 
  Value
0  good
1   bad
2      
3  good
4   bad

[5 rows x 1 columns]

第二个例子

In [1]: df = DataFrame(index=range(5))

In [2]: df['Value'] = ''

In [3]: df2 = DataFrame(dict(A=['foo','foo','bar','bar','bah']))

In [4]: df
Out[4]: 
  Value
0      
1      
2      
3      
4      

[5 rows x 1 columns]

In [5]: df2
Out[5]: 
     A
0  foo
1  foo
2  bar
3  bar
4  bah

[5 rows x 1 columns]

In [6]: df.loc[df2.A.str.contains('foo'),'Value'] = 'good'

In [7]: df.loc[df2.A.str.contains('bar'),'Value'] = 'bad'

In [8]: df
Out[8]: 
  Value
0  good
1  good
2   bad
3   bad
4      

[5 rows x 1 columns]

【讨论】:

您的代码假定您知道我的代码找到匹配项并标记它们的每个值的位置。这不是所有代码,因为文件太大 在我上面的例子中,我不知道 df.Matrix 中的值在哪里,所以 str.contains('Good') 在用 sch[i] 和检查的部分标记之前检查 bool value对于 bool 值会导致错误。您的代码没有错误,因为您分配了位置并输入了值。这是不一样的,因为如果我给你一个包含混合数据的文件并告诉你提取“好”你的程序将无法工作 我添加了一个像你这样的例子;是一样的,我知道是因为我写了代码:) 奇怪我不知道为什么会出现错误。他们似乎是一样的。是因为我的所有数据都在同一个数据框上编辑吗? 最好的方法是创建系列,然后直接分配它,例如df['Value'] = s,而不是将其创建为空并覆盖值。只需根据需要创建系列; pandas 将对齐它(用 nan 填充剩余的值)

以上是关于Python pandas 删除 SettingWithCopyWarning的主要内容,如果未能解决你的问题,请参考以下文章

Pandas - Python,根据日期列删除行

pandas python 怎么删除表格中的某一行?

pandas python 怎么删除表格中的某一行

Python/Pandas - 按列值删除重复行

Python - Pandas - 展开/删除累积和

使用 pandas 和 Python 删除重复项