Pandas SettingWithCopyWarning [重复]

Posted

技术标签:

【中文标题】Pandas SettingWithCopyWarning [重复]【英文标题】:Pandas SettingWithCopyWarning [duplicate] 【发布时间】:2014-12-30 16:58:56 【问题描述】:

Python 3.4 和 Pandas 0.15.0

df 是一个数据框,而 col1 是一个列。使用下面的代码,我正在检查值 10 的存在并将这些值替换为 1000。

df.col1[df.col1 == 10] = 1000

这是另一个例子。这一次,我根据索引更改 col2 中的值。

df.col2[df.index == 151] = 500

这两个都会产生以下警告:

-c:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

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

最后,

cols = ['col1', 'col2', 'col3']
df[cols] = df[cols].applymap(some_function)

这会产生类似的警告,并添加一个建议:

Try using .loc[row_indexer,col_indexer] = value instead

我不确定我是否理解警告中指出的讨论。写这三行代码有什么更好的方法?

请注意,这些操作有效。

【问题讨论】:

【参考方案1】:

这里的问题是:df.col1[df.col1 == 10] 返回一个副本。

所以我会说:

row_index = df.col1 == 10
# then with the form .loc[row_indexer,col_indexer]
df.loc[row_index, 'col1'] = 100

【讨论】:

谢谢。应该是 df.loc[row_index, 'col1'] = 100 吧? @asif.m 当然是 100% 正确的。我会解决的 你建议我为第三个示例做什么(使用“applymap”)? @asif.m 我需要一个可运行的示例,它使用applymap 来进一步提供帮助。【参考方案2】:

同意 Paul 关于 'loc' 的使用。

对于您的 applymap 案例,您应该可以这样做:

cols = ['col1', 'col2', 'col3']
df.loc[:, cols] = df[cols].applymap(some_function)

【讨论】:

这给出了同样的警告。但是这个没有: df.loc[:, cols] = df.loc[:, cols].applymap(some_function) 有趣。我使用的是 pandas 0.15.0 但 Python 2.7.5 所以没有用你的环境进行测试。我的建议不会对我发出警告。很高兴知道您的后一次尝试奏效了 即使我正在使用 .loc,我也会收到复制警告: col_pct = ['Cash', 'Funds'] ui_df.loc[:, col_pct] = ui_df.loc[:, col_pct].applymap('0:.2f%'.format)

以上是关于Pandas SettingWithCopyWarning [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Pandas介绍

python pandas怎么用

如何安装pandas

idle中没有pandas

Python pandas用法

python(pandas模块)?