问题描述
a b val1_b1 val1_b2 val2_b1 val2_v2
1 2 5 9 4 6
我想按列组取最大值,所以数据框将为:
a b val1 val2
1 2 9 6
或RMS:
a b val1 val2
1 2 sqrt(106) sqrt(52)
这样做的最好方法是什么?
解决方法
您可以将max
和DataFrame.groupby
按列使用,将axis=1
和lambda函数fors值放在第一个_
之前(如果存在):
df1 = df.groupby(lambda x: x.split('_')[0],axis=1).max()
print (df1)
a b val1 val2
0 1 2 9 6
编辑RMS
使用:
df2 = df.iloc[:,:2]
df3 = df.iloc[:,2:].pow(2).groupby(lambda x: x.split('_')[0],axis=1).sum().pow(1./2)
#alternative
df3 = (df.iloc[:,2:].groupby(lambda x: x.split('_')[0],axis=1)
.apply(lambda a: pd.Series(np.linalg.norm(a))))
df4 = pd.concat([df2,df3],axis=1)
print (df4)
a b val1 val2
0 1 2 10.29563 7.211103