将键从dict映射到dataframe列中的dicts列表

时间:2017-11-20 17:07:49

标签: python-3.x pandas dictionary mapping

我有一个如下所示的数据框(df):

         a   b                                              c
1    35-23  RB   {'1': '1', '13': '15', '14': '30', '20': '3'}
2    24-10  RB              {'1': '1', '13': '17', '14': '86'}
3    26-30  RB              {'1': '1', '13': '14', '14': '54'}  
4     14-7  RB                                              []
5    24-27  RB   {'1': '1', '13': '20', '14': '94', '15': '1'}
6    38-52  RB     {'1': '1', '70': '3', '72': '1', '84': '1'}
7    False  RB   {'1': '1', '70': '4', '71': '1', '72': '0.5'}
8    15-20  RB                                              []
9    30-17  RB                                              []

我还有另一本字典,它将人类可读的名字(约100个键,值对)提供给c栏中的字典键。它看起来像这样:

dict_names = {1: 'Test', 13: 'Ind Score', 14: 'Successful', 15: 'Cofactor', 20: 'Attempts', etc ...}

我想要做的是将我的dict_names值映射到我的df列c中的dicts列表中的键,所以我有可读的名字。然后,我会将dicts列表(列c),人类可读的名称,转换为我的df中的列名。

我知道我可以通过这样的方式将列c中的dicts转换为不同的列:

df['c'] = df['c'].apply(lambda x : dict(eval(x)))
df_stats = df['c'].apply(pd.Series)

然后我可以用df连接df_stats并删除旧列c。瞧!

但我仍然坚持使用df列c中的dicts列表键来映射dict_names值。

我正在寻找的最终df输出将是这样的:

         a   b  Test    Ind Score   Successful      Cofactor       Attempts ....
1    35-23  RB      1          15           30           NaN              3
2    24-10  RB      1          17           86           NaN            NaN  
3    26-30  RB      1          17           86           NaN            NaN              
4     14-7  RB    NaN         NaN          NaN           NaN            NaN
5    24-27  RB      1          20           94             1            NaN
6    38-52  RB      1          NaN         NaN           NaN            NaN
7    False  RB      1          NaN         NaN           NaN            NaN
8    15-20  RB    NaN          NaN         NaN           NaN            NaN
9    30-17  RB    NaN          NaN         NaN           NaN            NaN 

帮助找到我的最终输出方式将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以使用rename并传递dict来替换列;名称

from ast import literal_eval 
df['c'] = df['c'].apply(literal_eval) 
#dd={'1': 'Test', '13': 'Ind Score', '14': 'Successful', '15': 'Cofactor', '20': 'Attempts'}
dd= {str(k):v for k,v in dict_names.items()}#change
pd.concat([df.drop('c',1),df['c'].apply(pd.Series).rename(columns=dd)],1)

Out[1320]: 
       a   b Test Ind Score Successful Attempts
0  35-23  BR    1        15         30        3
1  24-10  BR    1        17         86      NaN
2  26-30  BR    1        14         54      NaN