Pandas :按多列分组。如何获得所有组合?

标签 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 选项,但从未设法获得完整的表格。

最佳答案

获取非零计数:

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))

关于 Pandas :按多列分组。如何获得所有组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44920704/

相关文章:

python - groupby 和平均 datetime64

python - Pandas to_sql 设置列类型

python - 如何在Python中使用pandas根据两个参数对记录进行分组

python - 对 Pandas 中的数据进行分组

python - 计算 Pandas 中一列字符串中的单词

python - 根据用户来自的集群将值分配给用户

python - 制作pandas数据透视表时如何保持数据框的顺序

python - 在数据框中添加字典作为新行

python - 无需合并的 Pandas 索引匹配

Python:如何在不聚合数据帧的情况下进行分组和计数