2016-08-22 35 views
3

我有一个像转换一个数据帧有多个值字典

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.任何帮助,将不胜感激。

回答

4

分组由'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]}} 
+0

这几乎工程。但是,有没有一种方法可以从字典中排除'ID'键? –

+0

这很简单,我编辑了我的答案。 – IanS

+0

是啊。这样可行。谢谢! –

2

您可以使用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() 
+1

感谢。这也适用。 :-) –