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