如果你使用.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
创建一个新列并更新其值:
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
我没有收到任何错误。但是,让我们根据前一个数据帧创建另一个数据帧:
new_df = df.loc[df.col1>2]
new_df
#col1 col2 new_column
#2 3 5 None
#3 4 6 None
现在,使用.loc
,我将尝试以相同的方式替换一些值:
new_df.loc[2, 'new_column'] = 100
然而,我再次收到了这个可恨的警告:
尝试在 DataFrame 的切片副本上设置一个值。尝试
使用 .loc[row_indexer,col_indexer] = value 代替
请参阅文档中的警告:https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
SOLUTION
use .copy()
创建新数据框时将解决警告:
new_df_copy = df.loc[df.col1>2].copy()
new_df_copy.loc[2, 'new_column'] = 100
现在,您将不会收到任何警告!
如果您的数据框是使用另一个数据框顶部的过滤器创建的,请始终使用.copy()
.