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

Pandas多级DataFrame按分组合并行:Diesel与Gas求和生成Fuel行

问题描述

现有如下方式合并得到的三级索引pandas DataFrame:

import pandas as pd

df1 = pd.DataFrame(
    {
        "Farm ID": ["1", "2", "2", "3", "3"],
        "Crop": ["Type A", "Type A", "Type B", "Type A", "Type B"],
        "Area": [8, 4, 2, 3, 5],
        "Diesel": [101, 215, 3, 0.6, 42],
        "Gas": [15, 35, 61, 95, 13]
    }
)
df1 = df1.set_index(['Farm ID', 'Crop'])

df2 = pd.DataFrame(
    {
        "Name": ["Area", "Diesel", "Gas"],
        "GHG": [690, 8.5, 13],
        "LU": [2.2, 0.3, 1.1],
    }
)
df2 = df2.set_index('Name')

s = df1.stack()
out = df2.reindex(s.index.get_level_values(2)).mul(s.values,axis=0)
out.index = s.index
out = out.rename_axis(['Farm ID','Crop', 'Type'])

out的结构如下,三级索引分别为Farm ID、Crop、Type:

GHG     LU
Farm ID Crop    Type        
1       Type A  Area    5520.0  17.60
                Diesel  858.5   30.30
                Gas     195.0   16.50
2       Type A  Area    2760.0  8.80
                Diesel  1827.5  64.50
                Gas     455.0   38.50
        Type B  Area    1380.0  4.40
                Diesel  25.5    0.90
                Gas     793.0   67.10
3       Type A  Area    2070.0  6.60
                Diesel  5.1     0.18
                Gas     1235.0  104.50
        Type B  Area    3450.0  11.00
                Diesel  357.0   12.60
                Gas     169.0   14.30

需求:在每个Farm ID和Crop分组内,对Type为Diesel和Gas的行的GHG、LU字段分别求和,生成Type为Fuel的新行,最终每个分组仅保留Area和Fuel两类Type行。

实现方案

可以通过拆分计算、再合并的方式实现,代码如下:

# 1. 提取所有Type为Area的行
area_part = out.xs('Area', level='Type', drop_level=False)

# 2. 筛选Diesel和Gas的行,按前两级索引分组求和,生成Fuel行
fuel_part = out[out.index.get_level_values('Type').isin(['Diesel', 'Gas'])]\
            .groupby(['Farm ID', 'Crop']).sum(numeric_only=True)\
            .assign(Type='Fuel')\
            .set_index('Type', append=True)

# 3. 合并两部分并排序索引得到最终结果
result = pd.concat([area_part, fuel_part]).sort_index()

执行后得到的result结构符合要求:

GHG      LU
Farm ID Crop   Type                
1       Type A Area   5520.0   17.60
               Fuel   1053.5   46.80
2       Type A Area   2760.0    8.80
               Fuel   2282.5  103.00
        Type B Area   1380.0    4.40
               Fuel    818.5   68.00
3       Type A Area   2070.0    6.60
               Fuel   1240.1  104.68
        Type B Area   3450.0   11.00
               Fuel    526.0   26.90

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:45:01