Pandas SettingWithCopyWarning [duplicate]

一曲冷凌霜 提交于 2019-11-26 08:16:34

问题


This question already has an answer here:

  • How to deal with SettingWithCopyWarning in Pandas? 14 answers

Python 3.4 and Pandas 0.15.0

df is a dataframe and col1 is a column. With the code below, I\'m checking for the presence of the value 10 and replacing such values with 1000.

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

Here\'s another example. This time, I\'m changing values in col2 based on index.

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

Both these produce the warning below:

-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

Finally,

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

This produces a similar warning, with an added suggestion:

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

I\'m not sure I understand the discussion pointed to in the warnings. What would be a better way to write these three lines of code?

Note that the operations worked.


回答1:


The issue here is that: df.col1[df.col1 == 10] returns a copy.

So I would say:

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



回答2:


Agreed with Paul about 'loc' usage.

For your applymap case you should be able to do this:

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


来源:https://stackoverflow.com/questions/26724378/pandas-settingwithcopywarning

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!