正在尝试在DataFrame的切片副本上设置求解值

Nig*_*ker 8 python dataframe pandas

我收到以下警告:

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame
Run Code Online (Sandbox Code Playgroud)

在以下行:

df3[['prod_tags_0', 'prod_tags_1', 'prod_tags_2', 'prod_tags_3']].fillna(0, inplace=True)
Run Code Online (Sandbox Code Playgroud)

我怎么能解决这个警告?

Dee*_*ace 10

df3[['prod_tags_0', 'prod_tags_1', 'prod_tags_2', 'prod_tags_3']]创建一个新的数据帧,它是一个子集df3.因为你正在使用inplace=True你正在获得上述警告,因为它试图修改新的数据框架,你没有保留参考(我怀疑如果你打印df3你会看到这条线实际上没有效果).

我会做以下其中一项:

  1. 重新分配新创建的数据帧,df3而不使用inplace=True:

    df3[['prod_tags_0', 'prod_tags_1', 'prod_tags_2', 'prod_tags_3']] = \
    df3[['prod_tags_0', 'prod_tags_1', 'prod_tags_2', 'prod_tags_3']].fillna(0)
    
    Run Code Online (Sandbox Code Playgroud)

或者稍微偏好的方式(至少在我看来):

  1. fillna将要修改的列作为字典传递.键是列的名称,值是NaN每列中应替换的值:

    df3.fillna({'prod_tags_0': 0, 'prod_tags_1': 0,
                'prod_tags_2': 0, 'prod_tags_3': 0}, inplace=True)
    
    Run Code Online (Sandbox Code Playgroud)

    在此示例中,您可以使用字典理解:

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'prod_tags_0': [np.nan], 'prod_tags_1': [np.nan], 
                       'prod_tags_2': [np.nan]})
    
    print(df)
    >>     prod_tags_0  prod_tags_1  prod_tags_2
        0          NaN          NaN          NaN   
    
    df.fillna({'prod_tags_' + str(i): 0 for i in range(2)}, inplace=True)
    
    print(df)
    
    >>     prod_tags_0  prod_tags_1  prod_tags_2
        0          0.0          0.0          NaN
    
    Run Code Online (Sandbox Code Playgroud)