【问题标题】:Converting a dataframe to dictionary with multiple values将数据框转换为具有多个值的字典
【发布时间】:2016-12-28 22:03:26
【问题描述】:

我有一个类似的数据框

Sr.No   ID       A         B          C         D
 1     Tom     Earth    English      BMW
 2     Tom     Mars     Spanish      BMW       Green          
 3     Michael Mercury  Hindi        Audi      Yellow
 4     John    Venus    Portugese    Mercedes  Blue
 5     John             German       Audi      Red

我正在尝试按 ID 将其转换为字典,例如:

{'ID' : 'Tom', 'A' : ['Earth', 'Mars'], 'B' : ['English', 'Spanish'], 'C' : 
                                                ['BMW', 'BMW'], 'D':['Green'] }, 

{'ID' : 'Michael', 'A' : ['Mercury'], 'B' : ['Hindi'], 'C' : ['Audi'],
                                                               'D':['Yellow']},

{'ID' : 'John', 'A' : ['Venus'], 'B' : ['Portugese', 'German'], 'C' : 
                                     ['Mercedes', 'Audi'], 'D':['Blue', 'Red'] }

This 有点类似于我想要的。

我也试过了,

df.set_index('ID').to_dict()

但这给了我长度为 5 而不是 3 的字典。任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas dictionary dataframe


    【解决方案1】:

    您可以使用groupbyto_dict 作为list,并将结果系列转换为dictionary

    df.set_index('Sr.No', inplace=True)
    df.groupby('ID').apply(lambda x: x.to_dict('list')).reset_index(drop=True).to_dict()
    
    {0: {'C': ['Mercedes', 'Audi'], 'ID': ['John', 'John'], 'A': ['Venus', nan],  
         'B': ['Portugese', 'German'], 'D': ['Blue', 'Red']}, 
     1: {'C': ['Audi'], 'ID': ['Michael'], 'A': ['Mercury'], 'B': ['Hindi'], 'D': ['Yellow']}, 
     2: {'C': ['BMW', 'BMW'], 'ID': ['Tom', 'Tom'], 'A': ['Earth', 'Mars'], 
         'B': ['English', 'Spanish'], 'D': [nan, 'Green']}}
    

    为了删除ID,你也可以这样做:

    df.groupby('ID')['A','B','C','D'].apply(lambda x: x.to_dict('list'))  \
                                     .reset_index(drop=True).to_dict()
    

    【讨论】:

      【解决方案2】:

      'ID' 分组并使用orient='list'to_dict 应用于每个组非常接近:

      df.groupby('ID').apply(lambda dfg: dfg.to_dict(orient='list')).to_dict()
      Out[25]: 
      {'John': {'A': ['Venus', nan],
        'B': ['Portugese', 'German'],
        'C': ['Mercedes', 'Audi'],
        'D': ['Blue', 'Red'],
        'ID': ['John', 'John'],
        'Sr.No': [4, 5]},
       'Michael': {'A': ['Mercury'],
        'B': ['Hindi'],
        'C': ['Audi'],
        'D': ['Yellow'],
        'ID': ['Michael'],
        'Sr.No': [3]},
       'Tom': {'A': ['Earth', 'Mars'],
        'B': ['English', 'Spanish'],
        'C': ['BMW', 'BMW'],
        'D': [nan, 'Green'],
        'ID': ['Tom', 'Tom'],
        'Sr.No': [1, 2]}}
      

      这应该只是稍微格式化结果的问题。

      编辑:从字典中删除'ID'

      df.groupby('ID').apply(lambda dfg: dfg.drop('ID', axis=1).to_dict(orient='list')).to_dict()
      Out[5]: 
      {'John': {'A': ['Venus', nan],
        'B': ['Portugese', 'German'],
        'C': ['Mercedes', 'Audi'],
        'D': ['Blue', 'Red'],
        'Sr.No': [4, 5]},
       'Michael': {'A': ['Mercury'],
        'B': ['Hindi'],
        'C': ['Audi'],
        'D': ['Yellow'],
        'Sr.No': [3]},
       'Tom': {'A': ['Earth', 'Mars'],
        'B': ['English', 'Spanish'],
        'C': ['BMW', 'BMW'],
        'D': [nan, 'Green'],
        'Sr.No': [1, 2]}}
      

      【讨论】:

        猜你喜欢
        • 2013-12-05
        • 2023-03-16
        • 2019-02-11
        • 2020-01-18
        • 2023-01-13
        • 2014-04-06
        • 2021-02-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多