根据另一个DataFrame中的条件对DataFrame执行计算

时间:2020-07-16 09:00:21

标签: python pandas dataframe

我正在使用COVID数据,并试图控制人口并显示每100,000的发病率。

我有一个带有填充的DataFrame:

**Country**  **Population**
China        1389102
Israel       830982
Iran         868912

我还有另一个显示COVID数据的DataFrame:

**Date**      **Country**  **Confirmed**
01/Jan/2020      China          8
01/Jan/2020      Israel         3
01/Jan/2020      Iran           2
02/Jan/2020      China          15
02/Jan/2020      Israel         5
02/Jan/2020      Iran           5

我希望使用人口数据框架中的信息对我的COVID数据框架进行计算。也就是说,通过以下方式对每个数据的每100,000个案例进行标准化:

(中国数据点/中国人口)* 100,000

与其他国家一样。

我对此很困惑,并且不太确定我是否通过对数据进行分组,压缩数据等来达到我的结果。 欢迎任何帮助。

编辑:我应该补充说,确认的病例每天都在累积。因此,例如,我希望在1月1日为中国演出:(8个/中国人口)* 100000,并在1月2日,1月3日,1月4日进行同样的表演...同样,对于每个国家,同样。本质上是根据另一个DataFrame中的数据对整个DataFrame进行计算。

5 个答案:

答案 0 :(得分:1)

假设您的数据帧分别称为df1df2,用“数据点”表示**Confirmed**列:

normed_cases = (
    df2.reset_index().groupby(['**Country**', '**Date**']).sum()['**Confirmed**'] 
    / df1.set_index('**Country**')['**Population**'] * 100000)
  • 重置df2的索引以使日期成为一列(仅在**Date**为之前的索引时适用)
  • 按国家/地区分组和日期,并对各组求和以得出每个国家/地区的总病例数和日期
  • 将国家/地区设置为第一个df df1的索引,以进行国家/地区索引划分
  • 按人口划分

答案 1 :(得分:1)

您可以合并2个数据框并执行操作:

# Define the norm operation
def norm_cases(cases, population):
    return (cases/population)*100

# If the column name for country is same in both dataframes
covid_df.merge(population_df, on='country_column', how='left')

# For different col names
covid_df.merge(population_df, left_on='covid_country_column', right_on='population_country_column', how='left')

covid_df['norm_cases'] = covid_df.apply(lambda x: norm_cases(x['cases_column'], x['population_column']), axis=1)

答案 2 :(得分:1)

我采取了一种结合您许多建议的方法。第一步,我合并了两个数据框。第二步,我将确认的列除以总体。第三步,我将同一列乘以100,000。也许有一种更优雅的方法,但这可行。

covid_df = covid_df.merge(population_df, on='Country', how='left')

covid_df["Confirmed"] = covid_df["Confirmed"].divide(covid_df["Population"], axis="index")

covid_df["Confirmed"] = covid_df["Confirmed"] *100000

答案 3 :(得分:0)

假设将填充为df_pop且将Covid数据作为df_data的数据框。

# Set index country of df_pop
df_pop = df_pop.set_index(['Country'])
# Norm value
norm = 100000
# Calculate norm cases
df_data['norm_cases'] = [((conf/df_pop.loc[country].Population )*norm
                         for (conf, country) in zip(df_data.Confirmed,df_data.Country) ]

答案 4 :(得分:0)

您可以使用df1.set_index('Country').join(df2.set_index('Country')) here,然后轻松执行此操作。