让我们假设我的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