首页 > 解决方案 > 就地添加新值和列

问题描述

我有一个看起来像这样的数据框:

         Front jvol  Back jvol    
row col                           
99  49        5734        5850    
    50        5735        5851    
    51        5736        5852    
    52        5737        5853 

和字典,如:

dict =   
{5734: 1,
 5735: 0,
 5736: 1,
 5737: 1,
 5850: -1,
 5851: 0,
 5852: -1,
 5853: -1} 

我正在尝试在每个列值上运行字典并在新列中返回结果,如下所示:

         Front jvol    Back jvol   Front jvol_d  Back jvol_d  
row col                                                 
99  49        5734        5850          1            -1  
    50        5735        5851          0             0  
    51        5736        5852          1            -1  
    52        5737        5853          1            -1

我试过这个:

columns = ['Front jvol', 'Back jvol']
columns_d = ['Front jvol_d', 'Back jvol_d']
df = pd.concat([df, pd.DataFrame(columns = columns_d)])

for col_d, col in zip(columns_d, columns):
    for ivol in range(len(df[col])):
        try:
            df[col_d][ivol] = dict[df[col][ivol]]
        except:
            pass

但结果很奇怪。它改变了其他列的格式并给出了SettingWithCopyWarning警告:

SettingWithCopyWarning:    
A value is trying to be set on a copy of a slice from a DataFrame
    
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
      df[col_d][ivol] = dict[df[col][ivol]]


         Front jvol    Back jvol   Front jvol_d  Back jvol_d  
row col                                                 
99  49     5734.0        5850.0          1            -1  
    50     5735.0        5851.0          0             0  
    51     5736.0        5852.0          1            -1  
    52     5737.0        5853.0          1            -1 

标签: pythonpandasdataframe

解决方案


首先重命名 variable dict,因为 python 代码字为dor dict1,然后使用DataFrame.replace- 如果没有匹配得到原始值:

d =   
{5734: 1,
 5735: 0,
 5736: 1,
 5737: 1,
 5850: -1,
 5851: 0,
 5852: -1,
 5853: -1} 

df = df.join(df.replace(d).add_prefix('_d'))

或者Series.map- 如果没有匹配值得到NaN

df = df.join(df.stack().map(d).unstack().add_prefix('_d'))

如果值始终与 dict 匹配,则两个解决方案都使用相同的输出。


推荐阅读