Pandas SettingWithCopyWarning

ba_*_*_ul 22 python warnings pandas chained-assignment

Python 3.4和Pandas 0.15.0

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

df.col1[df.col1 == 10] = 1000
Run Code Online (Sandbox Code Playgroud)

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

df.col2[df.index == 151] = 500
Run Code Online (Sandbox Code Playgroud)

这两个都产生以下警告:

-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
Run Code Online (Sandbox Code Playgroud)

最后,

cols = ['col1', 'col2', 'col3']
df[cols] = df[cols].applymap(some_function)
Run Code Online (Sandbox Code Playgroud)

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

Try using .loc[row_indexer,col_indexer] = value instead
Run Code Online (Sandbox Code Playgroud)

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

请注意,操作有效.

Pau*_*l H 39

这里的问题是: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
Run Code Online (Sandbox Code Playgroud)


小智 5

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

对于您的applymap案例,您应该能够这样做:

cols = ['col1', 'col2', 'col3']
df.loc[:, cols] = df[cols].applymap(some_function)
Run Code Online (Sandbox Code Playgroud)

  • 这给出了同样的警告.但是这个不是:df.loc [:,cols] = df.loc [:,cols] .applymap(some_function) (5认同)