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

DataFrame分组计算新冠病例指标遇Buffer dtype mismatch错误求助

解决分组计算新冠病例7日移动平均时的 dtype 不匹配错误

问题原因

你遇到的ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long',本质是groupby+rolling操作后返回的多级索引结果,无法直接和原DataFrame的单级索引对齐。groupby(['municipio'])['casosnovos'].rolling(7).sum()会生成包含municipio和原行索引的多级索引Series,直接赋值回原DataFrame列时,索引不匹配导致类型冲突。

另外,移除groupby后结果不正确,是因为移动平均和变化率计算没有按城市分组,会把不同城市的病例数据混在一起计算,逻辑错误。

修正后的代码

# 按城市分组计算7日累计,重置索引对齐原DataFrame
casos_por_estado['soma_casos_7d'] = casos_por_estado.groupby(['municipio'])['casosnovos'].rolling(window=7).sum().reset_index(level=0, drop=True)
casos_por_estado['media_casos_7d'] = casos_por_estado['soma_casos_7d'] / 7

# 按城市分组计算14期前的移动平均,避免跨城市取数
casos_por_estado['media_casos_7d_14d'] = casos_por_estado.groupby(['municipio'])['media_casos_7d'].shift(periods=14)
casos_por_estado['tx_variacaocasos'] = casos_por_estado['media_casos_7d'] / casos_por_estado['media_casos_7d_14d']

casos_por_estado['tendenciacasos'] = casos_por_estado['tx_variacaocasos'].apply(get_trend)

# 修正concat逻辑:原代码只传入单个元素,应该和已有temp_拼接
if temp_is_empty:
    temp_ = casos_por_estado
    temp_is_empty = False
else:
    # 正确拼接已有temp_和新的casos_por_estado
    temp_ = pd.concat([temp_, casos_por_estado], ignore_index=True)

casos_covid = temp_
temp_ = None

关键修改点说明

  • 重置索引对齐:在rolling().sum()后调用reset_index(level=0, drop=True),去掉groupby生成的municipio层级索引,让结果的索引和原DataFrame完全匹配,解决dtype不匹配问题。
  • 分组shift:计算变化率时,必须按municipio分组后再shift,确保只取同一城市14天前的移动平均,避免跨城市的错误计算。
  • 修正concat逻辑:原代码中pd.concat([casos_por_estado])等价于直接赋值,正确的做法是把已有temp_和新数据一起传入concat列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 04:17:46