微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python Pandas中的Groupby / Sum – 零计数没有显示……有时候

的背景

我有一个模拟人口数据集.它们具有以下属性

>年龄(0-120岁)
>性别(男,女)
>种族(白人,黑人,西班牙裔,亚洲人,其他)

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”变量求和来计算计数表.

有2个性别* 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中按对象创建组,以及我如何总结以查找每组中的计数.

解决方法:

使用带有预定义索引的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()

enter image description here

这填补了失踪年龄组

counts.reindex(midx, fill_value=0).unstack()

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐