2017-04-21 59 views
3

我有我要地图使用相同的字典一个新的列(并返回0如果在字典中没有匹配的密钥)两列。大熊猫:多列映射到一个列

>> codes = {'2':1, 
      '31':1, 
      '88':9, 
      '99':9} 

>> df[['driver_action1','driver_action2']].to_dict()  
{'driver_action1': {0: '1', 
    1: '1', 
    2: '77', 
    3: '77', 
    4: '1', 
    5: '4', 
    6: '2', 
    7: '1', 
    8: '77', 
    9: '99'}, 
'driver_action2': {0: '31', 
    1: '99', 
    2: '31', 
    3: '55', 
    4: '1', 
    5: '5', 
    6: '99', 
    7: '2', 
    8: '4', 
    9: '99'}} 

我想,我可能只是这样做:

>> df['driver_reckless_remapped'] = df[['driver_action1','driver_action2']].applymap(lambda x: codes.get(x,0)) 

预期输出:

driver_action1 driver_action2 driver_reckless_remapped 
0    1    31       1 
1    1    99       9 
2    77    31       1 
3    77    55       0 
4    1    1       0 
5    4    5       0 
6    2    99       1 
7    1    2       1 
8    77    4       0 
9    99    99       9 

而是我得到:

TypeError: ("'dict' object is not callable", 'occurred at index driver_action1') 

有没有办法来图多列到一个新列?

回答

4

IIUC可以使用combine_first()方法

df['new'] = = \ 
    df.driver_action1.map(codes).combine_first(df.driver_action2.map(codes)).fillna(0) 

检查:

In [106]: df['new'] = df.driver_action1.map(codes).combine_first(df.driver_action2.map(codes)).fillna(0) 

In [107]: df 
Out[107]: 
    driver_action1 driver_action2 driver_reckless_remapped new 
0    1    31      1 1.0 
1    1    99      9 9.0 
2    77    31      1 1.0 
3    77    55      0 0.0 
4    1    1      0 0.0 
5    4    5      0 0.0 
6    2    99      1 1.0 
7    1    2      1 1.0 
8    77    4      0 0.0 
9    99    99      9 9.0 
+0

伟大的作品,谢谢! – ale19

+0

@ ale19,欢迎您:) – MaxU

+0

使用多于2列时,这似乎不起作用......我添加了一些更多的文字到我的帖子中,以使用3列的示例进行说明。 – ale19