pandas:groupby多列。如何获得所有组合?

时间:2017-07-05 08:21:46

标签: pandas pandas-groupby

我有以下描述人的数据框,其中age_range已从年龄列计算

   age  gender group    age_range
0   46  F      1       >= 30 and < 60
1   50  F      1       >= 30 and < 60
2   63  F      2       >= 60
3   65  F      2       >= 60
4   34  F      1       >= 30 and < 60
5   42  F      2       >= 30 and < 60
6   55  F      1       >= 30 and < 60
7   57  M      1       >= 30 and < 60

从那里,我想要一个表格给出每个组,所有age_ranges和组中的人数和age_range,即使是空的箱子(两个组中的任何一个人和所有成员中的任何人<30)组1在> = 30且<60)。

我怎么能得到类似下面的内容?

    group   age_range       count
0   1       < 30            0
1   1       >= 30 and < 60  5
2   1       >= 60           0
3   2       < 30            0
4   2       >= 30 and < 60  1
5   2       >= 60           2

我尝试了多个groupby选项,但从未设法获得完整的表格。

1 个答案:

答案 0 :(得分:1)

获得非零计数:

g = df.groupby(['group','age_range']).size().to_frame('count').reset_index()

然后,您将需要一个包含所有组和年龄范围组合的虚拟表:

from itertools import product
combs = pd.DataFrame(list(product(df['group'], df['age_range'])), 
                     columns=['group', 'age_range'])

合并(SQL join)g,并用零替换NaN:

result = g.merge(combs, how = 'right').fillna(0)

单线解决方案:

df.groupby(['group','age_range']).size().to_frame('count').reindex(MultiIndex.from_product([df['group'].unique(), df['age_range'].unique()], fill_value = 0))