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

