pandas: 按多列分组。如何获取所有组合?

3
我有以下数据框描述人员信息,其中age_range是根据age列计算得出的。
   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

接下来,我想要一张表格,其中列出每个组的所有年龄段以及该组中每个年龄段的人数,即使是空箱(任何一个组中没有人年龄小于30岁,并且所有第一组成员年龄在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

我尝试了多种分组选项,但从未成功获得完整的表格。

1个回答

3
获取非零计数:
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连接)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))

非常好,非常感谢。这正是我所需要的。为了构建虚拟表,我必须从可能值的列表开始,因为并不是所有这些值都存在于实际数据框中。 - jnc
1
你可以使用 MultiIndex.from_product 做一个 reindex 替代 join - Maarten Fabré
实际上,这可能会更快:df.groupby(['group','age_range']).size().to_frame('count').reindex(MultiIndex.from_product([df['group'].unique(), df['age_range'].unique()])) - Ken Wei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接