如何在Python中实现类似R中mutate()的死亡/病例比率计算?
添加死亡数/病例数比率变量的实现方法
一、计算当日死亡/当日病例比率(单行列运算)
不需要使用transform(),直接对deaths和cases列做矢量化运算即可,同时要处理病例数为0的情况避免除以零错误:
# 生成当日死亡/病例比率列,病例数为0时设为NaN data1['death_case_ratio'] = data1['deaths'] / data1['cases'].replace(0, float('nan'))
这样处理后,所有当日病例数为0的行,比率值会显示为NaN,既避免运算报错也符合数据逻辑。
二、计算国家累计死亡/累计病例比率(分组运算)
如果你的需求是按国家计算累计死亡数与累计病例数的比率,可结合groupby实现,以下两种方式可选:
方法1:直接用累计函数(简洁高效)
# 按国家分组计算累计死亡、累计病例 data1['cum_deaths'] = data1.groupby('countriesandterritories')['deaths'].cumsum() data1['cum_cases'] = data1.groupby('countriesandterritories')['cases'].cumsum() # 计算累计比率,处理除零情况 data1['cum_death_case_ratio'] = data1['cum_deaths'] / data1['cum_cases'].replace(0, float('nan'))
方法2:用transform执行自定义分组运算
如果需要更复杂的分组逻辑,可通过transform()调用自定义函数:
def calculate_cumulative_ratio(group): group['cum_deaths'] = group['deaths'].cumsum() group['cum_cases'] = group['cases'].cumsum() group['cum_death_case_ratio'] = group['cum_deaths'] / group['cum_cases'].replace(0, float('nan')) return group # 按国家分组应用函数,生成累计比率列 data1 = data1.groupby('countriesandterritories').apply(calculate_cumulative_ratio)
注:
transform()更适合将分组计算结果广播回原数据行的场景,单纯的累计计算用cumsum()会更高效。
内容的提问来源于stack exchange,提问作者nur
相关产品推荐
相关产品推荐

