Python 3.x 基于dataframe中的其他列创建聚合列

Python 3.x 基于dataframe中的其他列创建聚合列,python-3.x,pandas,Python 3.x,Pandas,我有一个数据帧,如下所示: import pandas as pd import numpy as np import datetime # intialise data of lists. data = {'group' :["A","A","B","B","B"], 'A1_val' :[4,5,7,6,5], 'A1M_val' :[10,100,100,10,1], 'AB_val' :[4,5,7,

我有一个数据帧,如下所示:

import pandas as pd 
import numpy as np
import datetime

# intialise data of lists. 
data = {'group'      :["A","A","B","B","B"],
        'A1_val'     :[4,5,7,6,5],
        'A1M_val'     :[10,100,100,10,1],
        'AB_val'     :[4,5,7,6,5],
        'ABM_val'     :[10,100,100,10,1],
        'AM_VAL'     : [4,5,7,6,5]
       } 

# Create DataFrame 
df1 = pd.DataFrame(data) 
df1

    group   A1_val  A1M_val AB_val  ABM_val AM_VAL
0   A       4       10      4       10       4
1   A       5       100     5       100      5
2   B       7       100     7       100      7
3   B       6       10      6       10       6
4   B       5       1       5       1        5
步骤1:我想创建如下列: A1_agg_val=A1_val+A1M_val之和(从列中去掉M,如果名称匹配,则求和)

同样,AB_agg_val=AB_val+ABM_val

由于“AM_VAL”没有匹配列,因此AM_agg_VAL=AM_VAL

My expected output:

    group   A1_val  A1M_val AB_val  ABM_val AM_VAL  A1_AGG_val  AB_AGG_val  A_AGG_val
0   A       4       10      4       10       4      14          14          4
1   A       5       100     5       100      5      105         105         5
2   B       7       100     7       100      7      107         107         7
3   B       6       10      6       10       6      16          16          6
4   B       5       1       5       1        5      6           6           5

您可以在轴=1上使用groupby

out = (df1.assign(**df1.loc[:,df1.columns.str.lower().str.endswith('_val')]
       .groupby(lambda x: x[:2],axis=1).sum().add_suffix('_agg_value')))


列的顺序是否总是如图所示?是的,在去掉始终位于最后位置的“M”后,它基本上应该检查两列是否相等。如果去掉M,如何取AM的agg值?@anky_91它实际上是一个_agg_值。更新了问题中的预期输出好的,您可以尝试以下操作:
c=df1.columns.str.lower().str.endswith('u-val')
c1=df1.columns[c].str.split('u').str[0].str.strip('M')
df1.assign(**df1.loc[:,c.).groupby(c1,axis=1,sort=False.sum()。添加后缀('u-agg-value'))
在3个单独的行中该计算只应在后缀为“\u val”的列上进行超级优雅@anky\u 91,使我发现
分配
print(out)

  group  A1_val  A1M_val  AB_val  ABM_val  AM_VAL  A1_agg_value  AB_agg_value  \
0     A       4       10       4       10       4            14            14   
1     A       5      100       5      100       5           105           105   
2     B       7      100       7      100       7           107           107   
3     B       6       10       6       10       6            16            16   
4     B       5        1       5        1       5             6             6   

   AM_agg_value  
0             4  
1             5  
2             7  
3             6  
4             5