pandas 将 Dataframe 转换为具有多个值的字典

xu3bshqb  于 2023-03-21  发布在  其他
关注(0)|答案(3)|浏览(160)

我有一个 Dataframe

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的字典。任何帮助都将不胜感激。

1mrurvl1

1mrurvl11#

'ID'分组,并将to_dict应用于每个具有orient='list'的组非常接近:

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

o0lyfsai2#

您可以使用groupby和orient of to_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()
qxgroojn

qxgroojn3#

希望这能有所帮助。

# sample data
df = pd.DataFrame([[1,'a'],[1,'b'],[2,'c']], columns=['key', 'value'])
df
    key value
0   1   a
1   1   b
2   2   c

df.groupby('key')['value'].agg(list).to_dict()
{1: ['a', 'b'], 2: ['c']}

相关问题