You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python(Pandas)处理OWID新冠数据:去重并按国聚合统计

Python处理OWID新冠数据:按国家聚合统计

核心思路

OWID的新冠数据是时间序列格式,每个国家对应多条日期记录。要实现每个国家仅显示一次+聚合统计,关键是用Pandas的groupby按国家分组,再针对不同字段选择正确的聚合方式(累计字段取最大值,固定属性取单一值)。

完整代码实现

import pandas as pd

# 加载数据集
url = "https://raw.githubusercontent.com/owid/covid-19-data/master/public/data/owid-covid-data.csv"
df = pd.read_csv(url)

# 按国家分组聚合
# 注意:total_开头的字段是累计值,取最大值=最新累计总数;median_age是国家固定属性,取第一个值即可
aggregated_df = df.groupby('location').agg(
    total_tests=('total_tests', 'max'),
    total_vaccinations=('total_vaccinations', 'max'),
    total_deaths=('total_deaths', 'max'),
    avg_death_age=('median_age', 'first')  # 用median_age作为新冠死亡平均年龄的近似(OWID无直接对应字段)
).reset_index()

# 按国家名称字母排序
sorted_df = aggregated_df.sort_values('location').reset_index(drop=True)

# 处理缺失值(可选,将NaN替换为0)
sorted_df = sorted_df.fillna(0)

# 输出规整表格(Jupyter环境直接输出sorted_df即可;终端用to_markdown格式化)
print(sorted_df.to_markdown(index=False))

关键细节说明

  1. 为什么用max而非sum:
    OWID的total_tests/total_vaccinations/total_deaths是累计统计字段,每天的数值是截止到当天的累计数,因此每个国家的最大值就是最终的总统计数。如果用sum会把所有日期的累计值相加,得到完全错误的结果。

  2. 死亡平均年龄的字段选择:
    OWID数据集没有直接提供“新冠死亡平均年龄”字段,这里用median_age(国家人口中位年龄)作为近似值。如果有其他需求,可以替换为对应字段(比如aged_65_older表示65岁以上人口占比)。

  3. 去重与排序:
    groupby('location')自动完成国家名称去重,每个国家仅保留一条聚合后的记录;sort_values('location')实现按字母顺序排序。

输出示例(部分)

locationtotal_teststotal_vaccinationstotal_deathsavg_death_age
Afghanistan123456789012344567818.6
Albania98765476543211234538.9

内容的提问来源于stack exchange,提问作者ChemEGrant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 04:40:29