Pandas群过滤简化

2024-10-01 07:34:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到了一个数据框架,它被分为年龄组(“年龄组”列),然后过滤到贫困线以下的人群(100)。我想知道是否有一种简单的方法来计算贫困人口数除以总人口数或贫困率。这很管用,但似乎不太像Python

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

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

多谢各位


Tags: 数据方法框架df情况权重sumgroupby
2条回答

其他一些解决方案:

对于聚合和,仅筛选列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)

从你的描述中不清楚你为什么需要groupby。数据已被装箱。为什么不干脆创建一个贫困率列

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

相关问题 更多 >