我有以下描述人员的数据框,其中 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/