提问人:Ars ML 提问时间:3/6/2023 最后编辑:Ars ML 更新时间:3/6/2023 访问量:159
Pandas SettingWithCopyWarning 正在杀死我
Pandas SettingWithCopyWarning is killing me
问:
我尝试过滤 Pandas DataFrame:
df = pd.read_csv('ml_data.csv', dtype=str)
def df_filter(df):
#df = df.copy()
df.replace('(not set)', '(none)', inplace=True) #comment this and warning will disappear!!!
df = df[df['device_browser'] != '(none)'] #comment this and warning will disappear!!!
def browser_filter(s):
return ''.join([c for c in s if c.isalpha()])
df['device_browser'] = df['device_browser'].apply(browser_filter)
return df
df = df_filter(df)
我收到这个警告:
/tmp/ipykernel_2185/1710484338.py:11: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
df['device_browser'] = df['device_browser'].apply(browser_filter)
但是,如果我取消评论
#df = df.copy()
或注释
df.replace('(not set)', '(none)', inplace=True)
或注释
df = df[df['device_browser'] != '(none)']
OR 不会在函数中包装过滤df_filter
此警告将消失!!为什么??????????
我围着火篝篝舞,敲着手鼓......
答:
0赞
Adrien Riaux
3/6/2023
#1
因为通过创建数据帧的深层副本,默认情况下,您可以在文档中看到这一点。df.copy()
deep = True
因此,如果创建基本数据帧的深层副本,警告将消失。
但是,如果你不这样做,你将使用以下方法创建浅拷贝:
在您尝试使用 过滤浅拷贝后,这就是您收到此警告的原因。因此,如果您删除两行中的一行,则逻辑上您没有警告。df.replace('(not set)', '(none)', inplace=True)
df = df[df['device_browser'] != '(none)']
我邀请您检查一下这个 stackoverflow 问题中的浅拷贝和深拷贝之间的区别。
评论
0赞
Ars ML
3/6/2023
好的,但是为什么只有在执行此代码时才会出现此警告df_filter函数?
0赞
Ars ML
3/6/2023
我的目的是就地进行所有过滤,没有任何副本 - 深或浅。
0赞
Adrien Riaux
3/7/2023
是的,您可以,但无论如何,最好在修改数据帧之前复制数据帧。因此,您可以开始进行复制,然后在执行过滤器后进行复制。否则,对不起,我没有更好的答案。
评论