首页 > 解决方案 > 根据列名中的模式对列求和

问题描述

让我们从非常简化的抽象示例开始,我有一个这样的数据框:

import pandas as pd

d = {'1-A': [1, 2], '1-B': [3, 4], '2-A': [3, 4], '5-B': [2, 7]}
df = pd.DataFrame(data=d)

     1-A  1-B  2-A  5-B
0    1    3    3    2
1    2    4    4    7

我正在寻找优雅的 pandastic 解决方案来拥有这样的数据框:

     1    2    5
0    4    3    2
1    6    4    7

为了使示例更具体的列 1-A,表示人员 id=1,费用类别 A。行是每月的费用。结果,我想要跨类别的人均每月费用(因此第 1 列是第 1-A 列和第 1-B 列的总和)。请注意,当没有费用时,没有包含 0 的列。当然,它应该为更多列(id 和类别)做好准备。

我很确定存在具有良好分离列选择和求和操作的智能解决方案。

标签: pythonpandas

解决方案


使用groupby带有 split 的 lambda 函数并选择第一个值,按列分组添加axis=1

df1 = df.groupby(lambda x: x.split('-')[0], axis=1).sum()
#alternative
#df1 = df.groupby(df.columns.str.split('-').str[0], axis=1).sum()
print (df1) 

   1  2  5
0  4  3  2
1  6  4  7

推荐阅读