熊猫通过筛选简化分组

时间:2020-09-26 03:02:58

标签: python pandas pandas-groupby

我有一个数据框,该框已分类到各个年龄组(“ AgeGroups”列),然后过滤到贫困线以下(100岁)。我想知道是否有一种简单的方法来计算贫困人口的数量除以总人数或贫困率。这行得通,但似乎不是很pythonic。

“ PWGTP”列是在这种情况下求和的权重。

pov_rate = df[df['POV'] <= 100].groupby('AgeGroups').sum()['PWGTP'] /df.groupby('AgeGroups').sum()['PWGTP']

谢谢

2 个答案:

答案 0 :(得分:1)

从您的描述中不清楚您为什么需要分组。数据已经装箱。为什么不简单地创建贫困率列?

df['pov_rate']=(df['POV']<100)*df['PWGTP']/df['PWGTP'].sum()

答案 1 :(得分:0)

一些其他解决方案:

仅过滤列PWGTP以获得合计金额,如果有更多的数字列,则非常重要:

pov_rate = (df[df['POV'] <= 100].groupby('AgeGroups')['PWGTP'].sum() /
            df.groupby('AgeGroups')['PWGTP'].sum())
print (pov_rate)

只有一个groupby和辅助列filt

pov_rate = (df.assign(filt = df['PWGTP'].where(df['POV'] <= 100))
              .groupby('AgeGroups')[['filt','PWGTP']].sum()
              .eval('filt / PWGTP'))

print (pov_rate)

性能取决于组数,匹配的行数,数字列数和数据帧的长度,因此实际数据中的数据应有所不同。

np.random.seed(2020)

N = 1000000
df = pd.DataFrame({'AgeGroups':np.random.randint(10000,size=N),
                   'POV': np.random.randint(50, 500, size=N),
                   'PWGTP':np.random.randint(100,size=N),
                   'a':np.random.randint(100,size=N),
                   'b':np.random.randint(100,size=N),
                   'c':np.random.randint(100,size=N)})
# print (df)

In [13]: %%timeit
    ...: pov_rate = (df[df['POV'] <= 100].groupby('AgeGroups').sum()['PWGTP'] /
    ...:             df.groupby('AgeGroups').sum()['PWGTP'])
    ...:             
209 ms ± 7.97 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)


In [14]: %%timeit 
    ...: pov_rate = (df[df['POV'] <= 100].groupby('AgeGroups')['PWGTP'].sum() /
    ...:             df.groupby('AgeGroups')['PWGTP'].sum())
    ...:             
85.8 ms ± 332 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [15]: %%timeit
    ...: pov_rate = (df.assign(filt = df['PWGTP'].where(df['POV'] <= 100))
    ...:               .groupby('AgeGroups')[['filt','PWGTP']].sum()
    ...:               .eval('filt / PWGTP'))
    ...:               
122 ms ± 388 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)