如何用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))
关键细节说明
为什么用
max而非sum:
OWID的total_tests/total_vaccinations/total_deaths是累计统计字段,每天的数值是截止到当天的累计数,因此每个国家的最大值就是最终的总统计数。如果用sum会把所有日期的累计值相加,得到完全错误的结果。死亡平均年龄的字段选择:
OWID数据集没有直接提供“新冠死亡平均年龄”字段,这里用median_age(国家人口中位年龄)作为近似值。如果有其他需求,可以替换为对应字段(比如aged_65_older表示65岁以上人口占比)。去重与排序:
groupby('location')自动完成国家名称去重,每个国家仅保留一条聚合后的记录;sort_values('location')实现按字母顺序排序。
输出示例(部分)
| location | total_tests | total_vaccinations | total_deaths | avg_death_age |
|---|---|---|---|---|
| Afghanistan | 1234567 | 8901234 | 45678 | 18.6 |
| Albania | 987654 | 7654321 | 12345 | 38.9 |
内容的提问来源于stack exchange,提问作者ChemEGrant
相关产品推荐
相关产品推荐

