Pandas匹配两个DataFrame并按分类汇总各年度数值该如何实现?
匹配失败原因
df1.Thing.isin(df2)返回全False是因为isin()方法传入DataFrame时会按行匹配,而非遍历df2所有单元格匹配物品名称,所以无法得到预期结果。
实现步骤
- 转换df2为物品-品类映射表
你当前的df2是宽表存储,需要先重塑为每行对应一个物品和其所属品类的长表结构:
# 融化df2,把所有物品列转成行,删除无物品的空值行 df2_long = df2.melt(id_vars=df2.columns[0], value_name="Thing").dropna(subset=["Thing"]) # 重命名品类列 df2_long = df2_long.rename(columns={df2.columns[0]: "品类"})
- 关联品类信息到df1
把品类字段合并到存储年度数值的df1中:
df1 = df1.merge(df2_long[["品类", "Thing"]], on="Thing", how="left")
- 按品类分组汇总年度数值
按品类维度分组,对各年度字段求和即可得到结果:
result = df1.groupby("品类")[["2010", "2011", "2012"]].sum()
得到的result就是你需要的输出格式,索引为品类名,列是各年度汇总值。
内容的提问来源于stack exchange,提问作者user13998985
相关产品推荐
相关产品推荐

