将数据框转换为具有多个值的字典
Posted
技术标签:
【中文标题】将数据框转换为具有多个值的字典【英文标题】: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 的字典。任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:您可以使用groupby
和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()
【讨论】:
【参考方案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]
【讨论】:
以上是关于将数据框转换为具有多个值的字典的主要内容,如果未能解决你的问题,请参考以下文章