Pandas SettingWithCopyWarning 正在杀死我

Pandas SettingWithCopyWarning is killing me

提问人:Ars ML 提问时间:3/6/2023 最后编辑:Ars ML 更新时间:3/6/2023 访问量:159

问:

我尝试过滤 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赞 rpanai 3/6/2023
这回答了你的问题吗?如何处理 Pandas 中的 SettingWithCopyWarning
0赞 Ars ML 3/6/2023
不。为什么 df = df.copy() 删除警告?还是其他情况?
0赞 Tornike Kharitonishvili 3/6/2023
import warnings warnings.filterwarnings('ignore') -- 我用它来过滤掉警告。没有什么可以阻止你。只有一条消息。
0赞 Ars ML 3/6/2023
不,我不想压制警告,我想调查它!

答:

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
是的,您可以,但无论如何,最好在修改数据帧之前复制数据帧。因此,您可以开始进行复制,然后在执行过滤器后进行复制。否则,对不起,我没有更好的答案。