Python pandas 对列值应用函数(基于列名称模式)
Python pandas apply function on columns value (base on columns names patern)
我有一个数据框:
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 函数用于第一个 _
(如果存在)之前的值:
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
我有一个数据框:
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 函数用于第一个 _
(如果存在)之前的值:
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