Converting a dataframe to dictionary with multiple values

后端 未结 2 1409
太阳男子
太阳男子 2021-02-10 02:09

I have a dataframe like

Sr.No   ID       A         B          C         D
 1     Tom     Earth    English      BMW
 2     Tom     Mars     Spanish      BMW               


        
相关标签:
2条回答
  • 2021-02-10 02:36

    Grouping by 'ID' and apply to_dict to each group with orient='list' comes pretty close:

    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]}}
    

    It should just be a matter of formatting the result slightly.

    Edit: to remove 'ID' from the dictionaries:

    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]}}
    
    0 讨论(0)
  • 2021-02-10 02:43

    You can use groupby with orient of to_dict as list and convert the resultant series to a 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']}}
    

    Inorder to remove ID, you can also do:

    df.groupby('ID')['A','B','C','D'].apply(lambda x: x.to_dict('list'))  \
                                     .reset_index(drop=True).to_dict()
    
    0 讨论(0)
提交回复
热议问题