基于Pandas重构JHU新冠康复数据列及解决apply运算过慢问题
问题根源
你遇到的运行过慢问题完全是实现逻辑导致的,和数据集本身大小无关:
- 你使用
apply逐行遍历整个表,每处理一行都要全表扫描匹配「14天前同国家的数据」,时间复杂度为O(n²),该数据集累计有十几万行,这种写法跑数效率极低,几十分钟跑不完是正常情况 - 现有逻辑还有计算错误:你只按
Country/Region过滤14天前的数据,但是同一国家下可能有多个省/州条目,匹配时会返回多条结果而非你需要的对应区域的单条确诊值
优化方案
直接用pandas自带的分组移位函数实现需求,全流程运行只需要几秒,正确实现你的计算逻辑的代码如下:
import pandas as pd import wget urls = [ 'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv', 'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv' ] [wget.download(url) for url in urls] confirmed = pd.read_csv('time_series_covid19_confirmed_global.csv') deaths = pd.read_csv('time_series_covid19_deaths_global.csv') dates = confirmed.columns[4:] confirmed_long_form = confirmed.melt( id_vars =['Province/State', 'Country/Region', 'Lat', 'Long'], value_vars=dates, var_name='Date', value_name='Confirmed' ) deaths_long_form = deaths.melt( id_vars =['Province/State', 'Country/Region', 'Lat', 'Long'], value_vars=dates, var_name='Date', value_name='Deaths' ) full_table = confirmed_long_form.merge( right=deaths_long_form, how='left', on=['Province/State', 'Country/Region', 'Date', 'Lat', 'Long'] ) full_table['Date'] = pd.to_datetime(full_table['Date']) # 先按区域+日期排序,保证移位顺序正确 full_table = full_table.sort_values(by=['Country/Region', 'Province/State', 'Date'], ascending=True) # 按国家+省份分组,确诊列往前移14行,即为对应区域14天前的累计确诊,直接减当日死亡即可 full_table['Recovered'] = full_table.groupby(['Country/Region', 'Province/State'])['Confirmed'].shift(14) - full_table['Deaths'] # 前14天没有14天前的确诊数据,可以按需填充0或者保留NaN full_table['Recovered'] = full_table['Recovered'].fillna(0)
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

