基于另一DataFrame的条件将Pandas DataFrame分组为多级索引
按两级分类条件对DataFrame列分组求和
原始数据
df(包含100-109实体数据)
100 101 102 103 104 105 106 107 108 109 0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 2 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 3 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 4 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 6 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 7 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 8 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 9 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
df2(实体分类条件)
crit1 crit2 110 a A 109 a B 108 a A 107 b B 106 b A 105 a A 104 a B 103 a A 102 b B 101 b A 100 b A 99 b A
需求说明
df包含100-109这10个实体的数据,df2通过crit1、crit2两个条件对这10个实体(及其他实体)进行分类。需要将df按(crit1,crit2)两级列索引分组,每个组合对应的值为该组合下所有列的求和结果。例如,索引为('a','A')的新列是列[108,105,103]的和。
预期结果
crit1 a b crit2 A B A B 0 3.0 2.0 3.0 2.0 1 19.0 15.0 10.0 11.0 2 3.0 2.0 3.0 2.0 3 3.0 2.0 3.0 2.0 4 3.0 2.0 3.0 2.0 5 3.0 2.0 3.0 2.0 6 3.0 2.0 3.0 2.0 7 3.0 2.0 3.0 2.0 8 3.0 2.0 3.0 2.0 9 3.0 2.0 3.0 2.0
复现数据代码
import pandas as pd import numpy as np df = pd.DataFrame(np.ones((10,10)), index=np.arange(10), columns=np.arange(100,110)) df2 = pd.DataFrame(np.array([['a','A'],['a','B'],['a','A'],['b','B'],['b','A'],['a','A'],['a','B'],['a','A'],['b','B'],['b','A'],['b','A'],['b','A']]), index=np.arange(110,98,-1), columns=['crit1','crit2']) df.iloc[1] = np.arange(1,11)
解决方案
通过以下步骤实现需求:
- 从df2中筛选出df包含的实体,匹配列名类型
- 为df的列创建
(crit1,crit2)多级分组键 - 按列分组求和,调整列结构匹配预期结果
代码实现:
# 筛选df包含的实体,转换索引类型以匹配df列名 df2_filtered = df2.loc[df.columns.astype(int)] # 生成列对应的多级分组键 group_keys = list(zip(df2_filtered['crit1'], df2_filtered['crit2'])) # 按列分组求和,得到多级列索引结果 result = df.groupby(group_keys, axis=1).sum() # 调整列顺序以匹配预期结果 result = result.reindex(columns=[('a','A'), ('a','B'), ('b','A'), ('b','B')]) # 设置列索引层级名称 result.columns.names = ['crit1', 'crit2'] print(result)
运行后即可得到与预期一致的分组求和结果。
内容的提问来源于stack exchange,提问作者NicoH
相关产品推荐
相关产品推荐

