You need to enable JavaScript to run this app. pandas按ID分组行减法计算日度新增感染的实现与报错解决
优惠活动
大模型
产品
解决方案
定价
更多

pandas按ID分组行减法计算日度新增感染的实现与报错解决

报错原因与问题拆解
  1. 直接报错触发点:代码中if (df.loc[df['ID'] == key]) 直接将筛选后的DataFrame对象作为if判断条件,pandas无法明确判断该对象的布尔值,因此抛出ValueError: The truth value of a DataFrame is ambiguous。如果要判断筛选结果非空,需显式使用.empty属性判断,比如if not df.loc[df['ID'] == key].empty。
  2. 核心逻辑缺陷:原代码中shift(1)是对全局整列数据做移位,未按区域ID做分组隔离。即使修复了if判断的报错,跨区域的相邻行也会被错误纳入减法计算(比如DE2组的最后一条记录,移位取到的前值是DE1组第一条记录的数值),完全不符合同区域做相邻差分的业务要求。
可行实现方案

pandas中按分组计算相邻行差值属于向量化操作场景,无需手动循环遍历每个区域ID,直接使用groupby分组即可完成逻辑,性能远高于逐区域循环的写法,完全匹配预期输出要求:

  • 首先对原始数据按ID、date双字段排序,确保每个区域内的日期为正序排列,避免移位错位
  • 按区域ID分组,计算组内累计确诊值的相邻差分
  • 将每个区域首行的空值(无前置日期)替换为原始累计确诊值,符合“首行保留原累计数”的输出要求

可直接运行的示例代码:

import pandas as pd

def main(file):
    # 读取CSV,自动解析date字段为日期类型
    df = pd.read_csv(file, header='infer', parse_dates=['date'])
    # 按区域ID、日期升序排序,保证组内时间顺序正确
    df = df.sort_values(by=['ID', 'date']).reset_index(drop=True)
    # 按ID分组计算组内相邻行差值(等价于组内 值 - 值.shift(1))
    group_diff = df.groupby('ID')['confirmedInfections'].diff()
    # 组内首行无前置值的空位置,替换为原始累计确诊数
    df['confirmedInfections'] = group_diff.fillna(df['confirmedInfections']).astype(int)
    # 按区域分组打印结果,对齐示例输出格式
    for region_id, region_df in df.groupby('ID'):
        print(f"#For {region_id}")
        print(region_df.to_csv(index=False))

main('data.txt')

运行效果验证

按照你提供的原始CSV数据,上述代码输出完全匹配预期样例的计算逻辑:

#For DE1
ID,name,date,confirmedInfections
DE1,BADEN-WÜRTTEMBERG,2020-02-24,1
DE1,BADEN-WÜRTTEMBERG,2020-02-25,2
DE1,BADEN-WÜRTTEMBERG,2020-02-26,4

#For DE2
ID,name,date,confirmedInfections
DE2,BAYERN,2020-02-24,19
DE2,BAYERN,2020-02-25,0
DE2,BAYERN,2020-02-26,2

如果你更习惯使用shift(1)实现逻辑

groupby下的diff()本质是对同组内的confirmedInfections做value - value.shift(1)的封装,也可以手动写移位逻辑实现完全一致的效果:

# 替换group_diff计算行的等价写法
prev_value = df.groupby('ID')['confirmedInfections'].shift(1)
group_diff = df['confirmedInfections'] - prev_value

注意:不要手动循环每个区域ID做筛选、移位、赋值,这种写法不仅代码冗余,在数据量较大时性能远低于groupby的向量化实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 17:45:01