大Pandas:如何计算来自其他地方的种群百分比

2024-05-14 18:11:24 发布

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

我找到了这个关于新冠病毒疫苗接种的数据文件,我想看看(部分)人群的疫苗接种覆盖率。实际例子可能会更清楚,所以请耐心听我说

如果我使用df = pd.read_csv('https://epistat.sciensano.be/Data/COVID19BE_VACC.csv', parse_dates=['DATE'])读取csv,我会得到以下结果:

        DATE    REGION AGEGROUP SEX            BRAND DOSE  COUNT
0 2020-12-28  Brussels    18-34   F  Pfizer-BioNTech    A      1
1 2020-12-28  Brussels    45-54   F  Pfizer-BioNTech    A      2
2 2020-12-28  Brussels    55-64   F  Pfizer-BioNTech    A      3
3 2020-12-28  Brussels    55-64   M  Pfizer-BioNTech    A      1
4 2020-12-28  Brussels    65-74   F  Pfizer-BioNTech    A      2

我对按地区划分的数字特别感兴趣;日期。
所以我用df.groupby(['REGION','DATE']).sum()重新组合

                     COUNT
REGION   DATE             
Brussels 2020-12-28     56
         2020-12-30      5
         2021-01-05    725
         2021-01-06    989
         2021-01-07    994
...                    ...
Wallonia 2021-06-18  49567
         2021-06-19  43577
         2021-06-20   2730
         2021-06-21  37193
         2021-06-22  16938

为了比较不同地区的疫苗接种“速度”,我必须使用每个地区的人口将数据从绝对数转换为相对数

我发现一些帖子解释了如何在这样的多索引数据框中计算百分比,但问题是我想用原始数据框中没有的人口数除以每个计数

人口数字如下

REGION     POP
Flanders   6629143
Wallonia   3645243
Brussels   1218255

我认为解决方案必须是通过原始df循环并检查两个区域或索引级别,但我完全不知道如何进行。这是一项我想掌握的技术,因为当我想要不同人群的其他子集(可能是年龄组或性别)时,它可能会派上用场

非常感谢您阅读到这里

免责声明:我刚刚开始使用Python,这是我关于堆栈溢出的第一个问题,所以请对我温和一些。。。我之所以发布这篇文章,是因为我在其他任何地方都找不到答案。这可能是因为我没有记下术语,也不知道该找什么^ ^ ^


Tags: csv数据dfdatecount数字region地区
2条回答

您可以在groupby上运行reset_index(),然后在执行计算的自定义函数上运行df.apply

import pandas as pd

df = pd.read_csv('https://epistat.sciensano.be/Data/COVID19BE_VACC.csv', parse_dates=['DATE'])
df = df.groupby(['REGION','DATE']).sum().reset_index()

def calculate(row):
    if row['REGION'] == 'Flanders':
        return row['COUNT'] / 6629143
    elif row['REGION'] == 'Wallonia':
        return row['COUNT'] / 3645243
    elif row['REGION'] == 'Brussels':
        return row['COUNT'] / 1218255
    
df['REL_COUNT'] = df.apply(calculate, axis=1) #axis=1 takes the rows as input, axis=0 would run on columns

输出df.head()

^{tb1}$

一种选择是用^{}+^{}重新格式化population_df

population_df = pd.DataFrame({
    'REGION': {0: 'Flanders', 1: 'Wallonia', 2: 'Brussels'},
    'POP': {0: 6629143, 1: 3645243, 2: 1218255}
})

denom = population_df.set_index('REGION').rename(columns={'POP': 'COUNT'})

denom

            COUNT
REGION           
Flanders  6629143
Wallonia  3645243
Brussels  1218255

然后^{}相对于level=0groupby sum的结果:

new_df = df.groupby(['REGION', 'DATE']).agg({'COUNT': 'sum'}).div(denom, level=0)

new_df

                        COUNT
REGION   DATE                
Brussels 2020-12-28  0.000046
         2020-12-30  0.000004
         2021-01-05  0.000595
         2021-01-06  0.000812
         2021-01-07  0.000816
...                       ...
Wallonia 2021-06-18  0.013598
         2021-06-19  0.011954
         2021-06-20  0.000749
         2021-06-21  0.010203
         2021-06-22  0.004647

或作为新专栏:

new_df = df.groupby(['REGION', 'DATE']).agg({'COUNT': 'sum'})
new_df['NEW'] = new_df.div(denom, level=0)

new_df

                     COUNT       NEW
REGION   DATE                       
Brussels 2020-12-28     56  0.000046
         2020-12-30      5  0.000004
         2021-01-05    725  0.000595
         2021-01-06    989  0.000812
         2021-01-07    994  0.000816
...                    ...       ...
Wallonia 2021-06-18  49567  0.013598
         2021-06-19  43577  0.011954
         2021-06-20   2730  0.000749
         2021-06-21  37193  0.010203
         2021-06-22  16938  0.004647

相关问题 更多 >

    热门问题