计算Panda DataFrame中特定组的平均值(使用轴=1)-如何获得特定组



让我们假设我的DataFrame看起来与此类似(但有更多的列和行(:

import pandas as pd
df = pd.DataFrame({'A_1': [1.2, 1.4, 2.2], 
'A_2': [1.5, 2.3, 0.2], 
'A_3': [2.5, 0.7, 2.0], 
'B_1': [1.5, 0.9, 0.6], 
'B_2': [0.5, 1.3, 1.2], 
'B_3': [1.5, 2.5, 0.5], 
'C_1': [1.2, 0.3, 1.2], 
'C_2': [2.5, 2.3, 1.2],
'C_3': [1.5, 0.4, 0.8]})
df

结果如下:

A_1 A_2 A_3 B_1 B_2 B_3 C_1 C_2 C_3
0   1.2 1.5 2.5 1.5 0.5 1.5 1.2 2.5 1.5
1   1.4 2.3 0.7 0.9 1.3 2.5 0.3 2.3 0.4
2   2.2 0.2 2.0 0.6 1.2 0.5 1.2 1.2 0.8

现在我想使用轴=1来计算平均值,但总是针对特定的组,例如A-1、A-2、A-3,然后针对B-1、B-2、B-3组等(我的意思是-针对每一行,但实际上总是针对特定组(。因此,我用不同的";对于循环";和";。格式";函数,但它不起作用,例如:

ID = ["1","2","3"]
CHAIN = ["A","B","C"]
for CHAINS in CHAIN:
for IDS in ID:
df['{}-avg' .format(CHAINS)] = df[['{}_{}' .format(CHAINS,IDS)]].mean(axis=1)    

我在这里还发现,许多人使用";groupby";函数,但当我想按照描述的方式选择数据时,我不知道如何使用它。

我想要的输出应该是这样的:

A_1 A_2 A_3 B_1 B_2 B_3 C_1 C_2 C_3 A-avg       B-avg       C-avg
0   1.2 1.5 2.5 1.5 0.5 1.5 1.2 2.5 1.5 1.733333    1.166667    1.733333
1   1.4 2.3 0.7 0.9 1.3 2.5 0.3 2.3 0.4 1.466667    1.566667    1.000000
2   2.2 0.2 2.0 0.6 1.2 0.5 1.2 1.2 0.8 1.466667    0.766667    1.066667

可以,有人建议怎么拿吗?非常感谢。

如果要使用groupby解决方案,在_之前按所有列名分组,请使用带lambda函数的DataFrame.groupby和按列处理的axis=1

df1 = df.join(df.groupby(lambda x: x.split('_')[0], axis=1).mean().add_suffix('-avg'))
print (df1)
A_1  A_2  A_3  B_1  B_2  B_3  C_1  C_2  C_3     A-avg     B-avg     C-avg
0  1.2  1.5  2.5  1.5  0.5  1.5  1.2  2.5  1.5  1.733333  1.166667  1.733333
1  1.4  2.3  0.7  0.9  1.3  2.5  0.3  2.3  0.4  1.466667  1.566667  1.000000
2  2.2  0.2  2.0  0.6  1.2  0.5  1.2  1.2  0.8  1.466667  0.766667  1.066667

如果需要,只从列表中按组合选择列:

ID = ["1","2","3"]
CHAIN = ["A","B","C"]
from  itertools import product
cols = [f'{b}_{a}' for a, b in product(ID, CHAIN)]
print (cols)
df = df[cols]
print (df)
A_1  B_1  C_1  A_2  B_2  C_2  A_3  B_3  C_3
0  1.2  1.5  1.2  1.5  0.5  2.5  2.5  1.5  1.5
1  1.4  0.9  0.3  2.3  1.3  2.3  0.7  2.5  0.4
2  2.2  0.6  1.2  0.2  1.2  1.2  2.0  0.5  0.8
df1 = df.join(df.groupby(lambda x: x.split('_')[0], axis=1).mean().add_suffix('-avg'))

另一种选择是创建列名的映射,在映射上分组,并连接:

mapping = {entry: f"{entry[0]}-avg" for entry in df}
mapping
{'A_1': 'A-avg',
'A_2': 'A-avg',
'A_3': 'A-avg',
'B_1': 'B-avg',
'B_2': 'B-avg',
'B_3': 'B-avg',
'C_1': 'C-avg',
'C_2': 'C-avg',
'C_3': 'C-avg'}
#groupby and concat
pd.concat([df, df.groupby(mapping, axis=1).mean()], axis=1)
A_1 A_2 A_3 B_1 B_2 B_3 C_1 C_2 C_3    A-avg       B-avg    C-avg
0   1.2 1.5 2.5 1.5 0.5 1.5 1.2 2.5 1.5 1.733333    1.166667    1.733333
1   1.4 2.3 0.7 0.9 1.3 2.5 0.3 2.3 0.4 1.466667    1.566667    1.000000
2   2.2 0.2 2.0 0.6 1.2 0.5 1.2 1.2 0.8 1.466667    0.766667    1.066667

相关内容

最新更新