Python Pandas对列值应用函数基于列名称模式

问题描述

我有一个数据框:

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)   

这样做的最好方法是什么?

解决方法

您可以将maxDataFrame.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