假设我有一个数据帧(我将仅使用一个简单的示例),如下所示:
import pandas as pd
df = {'Col1':[3,4,2,6,5,7,3,4,9,7,1,3],
'Col2':['B','B','B','B','A','A','A','A','C','C','C','C',],
'Col3':[1,1,2,2,1,1,2,2,1,1,2,2]}
df = pd.DataFrame(df)
哪个给出这样的数据框:
Col1 Col2 Col3
0 3 B 1
1 4 B 1
2 2 B 2
3 6 B 2
4 5 A 1
5 7 A 1
6 3 A 2
7 4 A 2
8 9 C 1
9 7 C 1
10 1 C 2
11 3 C 2
我要做的是几个步骤:
1)对于Col2中的每个唯一值以及Col3中的每个唯一值,取平均Col1。因此,期望的输出将是:
Avg Col2 Col3
1 3.5 B 1
2 4 B 2
3 6 A 1
4 3.5 A 2
5 8 C 1
6 2 C 2
2)现在,对于Col3中的每个唯一值,我想要最高平均值和Col2中的相应值。所以
Best Avg Col2 Col3
1 8 C 1
2 4 B 2
我尝试使用df.groupby(['Col3','Col2'], as_index = False).agg({'Col1':'mean'}).groupby(['Col3']).agg({'Col1':'max'})
这给了我每个Col3值的最高平均值,但没有对应的Col2标签。谢谢您能提供的任何帮助!
答案 0 :(得分:2)
首先groupby
做sort_values
+ drop_duplicates
g1=df.groupby(['Col3','Col2'], as_index = False).agg({'Col1':'mean'})
g1.sort_values('Col1').drop_duplicates('Col3',keep='last')
Out[569]:
Col3 Col2 Col1
4 2 B 4.0
2 1 C 8.0
或者如果您的均值最大值重复
g1[g1.Col1==g1.groupby('Col3').Col1.transform('max')]
答案 1 :(得分:1)
执行以下操作(我对您的代码做了一些修改, 将其缩短一点):
df2 = df.groupby(['Col3','Col2'], as_index = False).mean()
打印结果时,输入以下内容即可:
Col3 Col2 Col1
0 1 A 6.0
1 1 B 3.5
2 1 C 8.0
3 2 A 3.5
4 2 B 4.0
5 2 C 2.0
然后运行:
res = df2.iloc[df2.groupby('Col3').Col1.idxmax()]
打印结果时,您将得到:
Col3 Col2 Col1
2 1 C 8.0
4 2 B 4.0
如您所见:
idxmax
给出具有“最大”元素的行的索引(对于每个
组),iloc
的参数。