2016-08-22 2 views
3

У меня есть dataframe какПреобразование 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' : '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]}} 

It должно быть просто вопросом форматирования результата smalll у.

Edit: удалить '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

Yup. Это работает. Благодаря! –

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

Спасибо. Это тоже работает. :-) –

Смежные вопросы