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

基于另一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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:30:08