如何使用pandas groupby创建字典?

问题描述 投票:0回答:2

我有一个数据框,其中包含不同患者组中每个人的多个变量的值。例如,我有患者组中多个个体的年龄、性别、体重等,例如痴呆症、健康对照等。我想最终为每个组创建一个字典,如下所示:

{'Group': ['dementia', 'dementia', 'dementia'],
   'Age': [66, 67, 90],
   'Sex': ['M', 'M', 'F']} 

如何循环遍历数据框并为每个数据框创建字典?到目前为止我所拥有的是 for 循环的开始:

for group in df.groupby('diagnosis'): 

谢谢!

python pandas dictionary group-by
2个回答
1
投票

假设这样的输入:

             Group  Age Sex
0  healthy control   70   F
1         dementia   66   M
2         dementia   90   F
3  healthy control   62   M
4  healthy control   64   F
5         dementia   67   M

如果您需要经典循环中的字典,只需使用

to_dict
:

转换组即可
for key, group in df.groupby('Group'):
    d = group.to_dict('list')

或者,您可以使用简单的字典理解来获取字典的字典:

out = {k: g.to_dict('list') for k, g in df.groupby('Group')}

输出:

{'dementia': {'Age': [66, 90, 67],
              'Group': ['dementia', 'dementia', 'dementia'],
              'Sex': ['M', 'F', 'M']},
 'healthy control': {'Age': [70, 62, 64],
                     'Group': ['healthy control',
                               'healthy control',
                               'healthy control'],
                     'Sex': ['F', 'M', 'F']}}

或者,由于该组已经作为键存在,因此将其从内部字典中删除:

cols = df.columns.difference(['Group'])
out = {k: g.to_dict('list') for k, g in df.groupby('Group')[cols]}

输出:

{'dementia': {'Age': [66, 90, 67], 'Sex': ['M', 'F', 'M']},
 'healthy control': {'Age': [70, 62, 64], 'Sex': ['F', 'M', 'F']}}

0
投票

您可以使用@mozway 输入尝试类似的操作:

             Group  Age Sex
0  healthy control   70   F
1         dementia   66   M
2         dementia   90   F
3  healthy control   62   M
4  healthy control   64   F
5         dementia   67   M

使用 groupby 创建数据帧组的字典。

df_dicts = dict(tuple(df.groupby('Group')))

使用以 Group 为键的字典打印每个组:

df_dicts['dementia'].to_dict('list')

输出:

{'Group': ['dementia', 'dementia', 'dementia'],
 'Age': [66, 90, 67],
 'Sex': ['M', 'F', 'M']}

df_dicts['healthy control'].to_dict('list')

输出:

{'Group': ['healthy control', 'healthy control', 'healthy control'],
 'Age': [70, 62, 64],
 'Sex': ['F', 'M', 'F']}
© www.soinside.com 2019 - 2024. All rights reserved.