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
相关产品推荐
相关产品推荐

