Преобразование фрейма данных pandas во вложенный словарь с определенным ключом

#python #pandas #dataframe

#python #pandas #фрейм данных #словарь #pandas-groupby

Вопрос:

Я пытаюсь создать вложенный словарь из фрейма данных pandas в следующем формате:

 Name Info  Location  Alias

AA   InfoA locationA AliasA
BB   InfoB locationB AliasB
CC   InfoC locationC AliasC
  

Результат, который я ищу, имеет следующий формат:

 my_nested_dict = {"AA": {"Info" : "InfoA", "Location": {"Where": "locationA", "Alias": "AliasA"},
                  "BB": {"Info" : "InfoB", "Location": {"Where": "locationB", "Alias": "AliasB"},
                  "CC": {"Info" : "InfoC", "Location": {"Where": "locationC", "Alias": "AliasC"}
}
  

Я пытался использовать groupby и применить лямбда-выражение с помощью set_index, но, похоже, я делаю это неправильно:

 df.groupby('Name')[['Location', 'Alias']].apply(lambda x: x.set_index('Location').to_dict(orient='index')).to_dict()
  

Но при этом я не могу добавить ключ «Where». Результат выглядит следующим образом:

 my_nested_dict = {"AA": {"Info" : "InfoA", "Location": {"locationA": {"Alias": "AliasA"}},
                  "BB": {"Info" : "InfoB", "Location": {"locationB": {"Alias": "AliasB"}},
                  "CC": {"Info" : "InfoC", "Location": {"locationC": {"Alias": "AliasC"}}
}
  

Кроме того, я попытался сначала преобразовать интересующие меня столбцы, что работает, но мне трудно заменить столбец «Местоположение» результатом:

 df[['Location', 'Alias']].rename(columns={'Location': 'Where'}).to_dict('index')
  

Есть ли чистый способ pandas для достижения желаемого результата?

Ответ №1:

Моя попытка:

 d = df.set_index("Name").to_dict("index")
for k,v in d.items():
    d[k]["Location"] = {"Where": v["Location"], "Alias": v["Alias"]}
    d[k].pop("Alias", None)
  

 {'AA': {'Info': 'InfoA', 'Location': {'Where': 'locationA', 'Alias': 'AliasA'}},
 'BB': {'Info': 'InfoB', 'Location': {'Where': 'locationB', 'Alias': 'AliasB'}},
 'CC': {'Info': 'InfoC', 'Location': {'Where': 'locationC', 'Alias': 'AliasC'}}}
  

Мне интересно, есть ли чистое решение pandas, потому что то, которое я придумал, кажется слишком неуклюжим

Ответ №2:

Вы могли бы сделать:

 my_dict = (df.rename(columns={'Location' : 'where'})
             .assign(Location = lambda df: df.apply(lambda df: {'where' : df['where'],
                                                                'Alias' : df['Alias']}, 
                                                    axis=1))
             .set_index('Name')[['Info', 'Location']]
             .to_dict('index')
          )
print(my_dict)
  

Вывод

 {'AA': {'Info': 'InfoA', 'Location': {'where': 'locationA', 'Alias': 'AliasA'}}, 
 'BB': {'Info': 'InfoB', 'Location': {'where': 'locationB', 'Alias': 'AliasB'}}, 
 'CC': {'Info': 'InfoC', 'Location': {'where': 'locationC', 'Alias': 'AliasC'}}}