【问题标题】:Mapping keys from dict to list of dicts in dataframe column将字典中的键映射到数据框列中的字典列表
【发布时间】:2018-05-03 23:45:27
【问题描述】:

我有一个如下所示的数据框(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                                              []

我还有另一个字典,它为 c 列中的字典键提供了人类可读的名称(大约 100 个键、值对)。它看起来像这样:

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

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

我知道我可以通过执行以下操作将 c 列中的字典转换为不同的列:

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

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

但我坚持将 dict_names 值与我的 df 列 c 中的 dicts 列表的键映射。

我正在寻找的最终 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 

如果能帮助我找到最终输出的方法,我们将不胜感激。

【问题讨论】:

    标签: python-3.x pandas dictionary mapping


    【解决方案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
    

    【讨论】:

    • 也许添加 df['c'].apply(literal_eval) 会使这个解决方案更加出色。
    • @Bharath 是的,你是对的,请随时编辑它:-)
    • 同意,我需要这样做才能扩展新列,但我仍然将数字键(1、13、14 等)作为列标题,而不是人类可读的名称。跨度>
    • @ChiChi 你在 datatframe 中有 str 但在你的 dict 键中有 int
    猜你喜欢
    • 2018-08-13
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 2021-05-26
    • 2021-06-26
    相关资源
    最近更新 更多