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

Python处理OWID新冠数据填充DataFrame过慢,如何去掉显式循环提升性能

问题1:不同数据格式对处理效率的影响

OWID提供的XLSX、JSON格式不会提升你的处理效率,原因如下:

  • XLSX属于压缩二进制格式,读取时需要先解压再做结构解析,耗时远高于直接读取纯文本CSV
  • 3D结构的JSON解析成本更高,你需要的疫情数据是扁平的二维表结构,JSON的嵌套结构反而会增加额外的格式解析开销,占用更多内存
    你当前选择的CSV格式是处理这类结构化表格数据效率最高的选择,不需要更换格式。
问题2:循环填充DataFrame的性能优化方案

你原来的双层循环+逐行布尔索引的写法时间复杂度极高,每次循环都要做全表扫描,是pandas性能的典型反面案例。你可以直接用pandas内置的透视+重索引操作,完全不需要写显式循环就能实现需求,性能提升至少上千倍。
优化后代码如下:

import pandas as pd
import datetime

# 读取数据和日期格式转换保持不变
data = pd.read_csv("https://raw.githubusercontent.com/owid/covid-19-data/master/public/data/owid-covid-data.csv")
data['date'] = pd.to_datetime(data['date'])

buffer = 30
# 生成你需要的完整日期范围
full_date_range = pd.date_range(start=data['date'].min() - datetime.timedelta(buffer), end=data['date'].max())

# 直接透视生成宽表:索引为日期,列名为国家,值为对应的统计指标
cases_wide = data.pivot(index='date', columns='location', values='total_cases')
deaths_wide = data.pivot(index='date', columns='location', values='total_deaths')

# 重索引补全所有缺失的日期,自动对齐现有数据,缺失位置默认填充NaN
cases = cases_wide.reindex(full_date_range)
deaths = deaths_wide.reindex(full_date_range)

# 如果你需要对缺失值做填充(比如用最近一天的有效数据补齐,适合差分计算),可以加前向填充逻辑
# cases = cases.ffill()
# deaths = deaths.ffill()

这个实现的所有运算都是pandas底层C实现的向量化操作,原本20分钟的任务运行耗时不会超过10秒,结果和你原来的循环实现完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 20:24:07