我有以下描述人的数据框,其中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选项,但从未设法获得完整的表格。
答案 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))