背景
我有一个模拟人群的数据集。它们具有以下属性
df.head()
Age Race Gender in_population
0 32 0 0 1
1 53 0 0 1
2 49 0 1 1
3 12 0 0 1
4 28 0 0 1
还有另一个变量将个体标识为“In_Population”*,它是一个布尔变量。我在pandas中使用groupby将3个属性的可能组合分组,通过对每个可能类别的人中的“In_Population”变量求和来计算计数表。
有两个性别* 5个种族* 121个年龄= 1210个可能的群体,每个人口中都会受到影响。
如果特定年份中某一特定人群没有成员(例如0岁男性“其他”),那么我仍然希望该群组出现在我的分组数据框中,但计数为零。这在以下数据样本中正确发生(Age = 0,Gender = {0,1},Race = 4)。在这个特定的
中没有“其他”零岁的孩子grouped_obj = df.groupby( ['Age','Gender','Race'] )
groupedAGR = grouped_obj.sum()
groupedAGR.head(10)
in_population
Age Gender Race
0 0 0 16
1 8
2 63
3 5
4 0
1 0 22
1 4
2 64
3 12
4 0
问题
这只发生在一些Age-Gender-Race组合中。 有时,零和组完全被跳过。以下是45岁的数据。我期待看到0,表明此数据集中没有45岁的男性“其他”比赛。
>>> groupedAGR.xs( 45, level = 'Age' )
in_population
Gender Race
0 0 515
1 68
2 40
3 20
1 0 522
1 83
2 48
3 29
4 3
备注
* “In_Population” 在计算“死亡率”时,基本上过滤掉不属于相关人口的“新生儿”和“移民”;人口中的死亡发生在移民和分娩发生之前,所以我将他们排除在计算之外。我怀疑这与它有关 - 零岁的孩子显示零数,但其他所有年龄组都没有显示任何东西......但事实并非如此。
>>> groupedAGR.xs( 88, level = 'Age' )
in_population
Gender Race
0 0 52
2 1
3 0
1 0 62
1 3
2 5
3 3
4 1
人口中没有88岁的亚洲男性,因此该类别中只有零。人口中没有88岁的“其他”男性,但他们根本没有出现。
编辑:我在代码中添加了如何在pandas中按对象创建组,以及我如何总结以查找每组中的计数。
答案 0 :(得分:5)
将reindex
与预定义索引和fill_value=0
ages = np.arange(21, 26)
genders = ['male', 'female']
races = ['white', 'black', 'hispanic', 'asian', 'other']
sim_size = 10000
midx = pd.MultiIndex.from_product([
ages,
genders,
races
], names=['Age', 'Gender', 'Race'])
sim_df = pd.DataFrame({
# I use [1:-1] to explicitly skip some age groups
'Age': np.random.choice(ages[1:-1], sim_size),
'Gender': np.random.choice(genders, sim_size),
'Race': np.random.choice(races, sim_size)
})
这些将缺少年龄组
counts = sim_df.groupby(sim_df.columns.tolist()).size()
counts.unstack()
这会填补失踪年龄段
counts.reindex(midx, fill_value=0).unstack()