尝试使用 .loc[row_indexer,col_indexer] = value 代替警告,即使在使用正式

Pra*_*san 12 python pandas

这是我的代码中获得 SettingWithCopyWarning 的行之一:

value1['Total Population']=value1['Total Population'].replace(to_replace='*', value=4)
Run Code Online (Sandbox Code Playgroud)

然后我改为:

row_index= value1['Total Population']=='*'
value1.loc[row_index,'Total Population'] = 4
Run Code Online (Sandbox Code Playgroud)

这仍然给出相同的警告。我该如何摆脱它?

另外,我收到了与我使用过的convert_objects(convert_numeric=True)函数相同的警告,有什么办法可以避免这种情况。

 value1['Total Population'] = value1['Total Population'].astype(str).convert_objects(convert_numeric=True)
Run Code Online (Sandbox Code Playgroud)

这是我收到的警告消息:

试图在来自 DataFrame 的切片副本上设置值。尝试使用 .loc[row_indexer,col_indexer] = value 代替

请参阅文档中的警告:http : //pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

Ale*_*der 10

您是否尝试过直接设置?:

value1.loc[value1['Total Population'] == '*', 'Total Population'] = 4
Run Code Online (Sandbox Code Playgroud)


Had*_*dij 10

如果您使用.loc[row,column]并且仍然出现相同的错误,则可能是因为复制了另一个数据框。你必须使用.copy().

这是一步一步的错误再现:

import pandas as pd

d = {'col1': [1, 2, 3, 4], 'col2': [3, 4, 5, 6]}
df = pd.DataFrame(data=d)
df
#   col1    col2
#0  1   3
#1  2   4
#2  3   5
#3  4   6
Run Code Online (Sandbox Code Playgroud)

创建一个新列并更新其值:

df['new_column'] = None
df.loc[0, 'new_column'] = 100
df
#   col1    col2    new_column
#0  1   3   100
#1  2   4   None
#2  3   5   None
#3  4   6   None
Run Code Online (Sandbox Code Playgroud)

我没有收到错误。但是,让我们根据前一个数据框创建另一个数据框:

new_df = df.loc[df.col1>2]
new_df
#col1   col2    new_column
#2  3   5   None
#3  4   6   None
Run Code Online (Sandbox Code Playgroud)

现在,使用.loc,我将尝试以相同的方式替换一些值:

new_df.loc[2, 'new_column'] = 100
Run Code Online (Sandbox Code Playgroud)

但是,我再次收到了这个可恶的警告:

试图在来自 DataFrame 的切片副本上设置值。尝试使用 .loc[row_indexer,col_indexer] = value 代替

请参阅文档中的注意事项:https : //pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

解决方案

使用.copy()在创建新的数据帧将解决警告:

new_df = df.loc[df.col1>2].copy()
new_df.loc[2, 'new_column'] = 100
Run Code Online (Sandbox Code Playgroud)

现在,您将不会收到任何警告!

如果您的数据框是使用另一个数据框顶部的过滤器创建的,请始终使用.copy().