如何将pandas数据帧转换为嵌套字典

MRR*_*MRR 4 python dataframe pandas

我正在运行Python 3.6和Pandas 0.19.2并有一个DataFrame,如下所示:

Name      Chain        Food       Healthy  

George    McDonalds    burger     False
George    KFC          chicken    False
John      Wendys       burger     False
John      McDonalds    salad      True
Run Code Online (Sandbox Code Playgroud)

我想将此数据帧转换为dict,如下所示:

health_data = {'George': {'McDonalds': {'Food': 'burger', 'Healthy':False},
                          'KFC':       {'Food': 'chicken', 'Healthy':False}},
               'John':   {'Wendys':    {'Food': 'burger', 'Healthy':False},
                          'McDonalds': {'Food': 'salad', 'Healthy': True}}}
Run Code Online (Sandbox Code Playgroud)

到目前为止我的想法是:

  1. 用于df.groupby对名称列进行分组
  2. 使用df.to_dict()的数据帧转换成的线沿线的字典: health_data = input_data.set_index('Chain').T.to_dict()

思考?在前面感谢您的帮助.

jez*_*ael 14

我认为你非常接近。

使用groupbyto_dict

df = df.groupby('Name')[['Chain','Food','Healthy']]
       .apply(lambda x: x.set_index('Chain').to_dict(orient='index'))
       .to_dict()

print (df)
{'George': {'KFC': {'Healthy': False, 'Food': 'chicken'}, 
           'McDonalds': {'Healthy': False, 'Food': 'burger'}}, 
'John': {'McDonalds': {'Healthy': True, 'Food': 'salad'},
         'Wendys': {'Healthy': False, 'Food': 'burger'}}}
Run Code Online (Sandbox Code Playgroud)

  • @jezrael 如果另一行有“乔治,麦当劳,鸡肉,假”,你会如何调整这个?换句话说,将会有重复的索引值,因为“McDonalds”对于“George”出现了两次,因此它会抛出 ValueError,因为索引对于 'orient='index'' 必须是唯一的。 (3认同)

piR*_*red 5

字典理解+ groupby

{n: grp.loc[n].to_dict('index')
 for n, grp in df.set_index(['Name', 'Chain']).groupby(level='Name')}

{'George': {'KFC': {'Food': 'chicken', 'Healthy': False},
  'McDonalds': {'Food': 'burger', 'Healthy': False}},
 'John': {'McDonalds': {'Food': 'salad', 'Healthy': True},
  'Wendys': {'Food': 'burger', 'Healthy': False}}}
Run Code Online (Sandbox Code Playgroud)

defaultdict

from collections import defaultdict

d = defaultdict(dict)

for i, row in df.iterrows():
    d[row.Name][row.Chain] = row.drop(['Name', 'Chain']).to_dict()

dict(d)

{'George': {'KFC': {'Food': 'chicken', 'Healthy': False},
  'McDonalds': {'Food': 'burger', 'Healthy': False}},
 'John': {'McDonalds': {'Food': 'salad', 'Healthy': True},
  'Wendys': {'Food': 'burger', 'Healthy': False}}}
Run Code Online (Sandbox Code Playgroud)

  • 喜欢使用 iterrows 和 default dict,尽管它比 group by 慢一点。这将允许您将多个循环链接在一起。另一种方法是使用多索引(但不适合本示例) (2认同)