我有一个示例数据框,如下所示
p1 p2 p3 score
0 1 a t1 0.408718
1 1 a t2 0.694732
2 1 a t3 0.001077
3 1 b t1 0.250646
4 1 b t2 0.877506
5 1 b t3 0.033305
6 2 a t1 0.735524
7 2 a t2 0.055166
8 2 a t3 0.579875
9 2 b t1 0.579199
10 2 b t2 0.785301
11 2 b t3 0.339372
p1
,p2
和p3
是参数。我想做的是根据p3
选择具有最大平均值的p1和p2值的最佳行。
例如,在给定的数据帧中,此函数应返回第9、10、11行之一,因为p3得分的平均值(0.579199, 0.785301, 0.339372)
= 0.567958
是我可以从任何数据中获取的最大值给定一组p1
和p2
。
我到目前为止的尝试(使用pandas groupy)如下
temp = []
for eachgroup in df.groupby(['p1', 'p2']).groups.keys():
temp.append(df.groupby(['p1', 'p2']).get_group(eachgroup)['score'])
temp1 = []
for each in temp:
temp1.append(each.mean())
maxidx = temp1.index(max(temp1))
temp[maxidx].index
返回以下输出
Int64Index([9, 10, 11], dtype='int64')
但是,这效率非常低,并且仅适用于较小的数据帧。对于更大的数据框,我该怎么做?
答案 0 :(得分:6)
以您的情况
s=df.groupby(['p1','p2']).score.transform('mean')
s.index[s==s.max()]
Out[239]: Int64Index([9, 10, 11], dtype='int64')
答案 1 :(得分:3)
使用groupby
和transform
:
>>> df.groupby(['p1', 'p2']).score.transform('mean').idxmax()
9
如果相反,您想要与此最大值对应的p1
和p2
的组合:
>>> df.groupby(['p1', 'p2']).score.mean().idxmax()
(2, 'b')
如果您想查看创建最大平均值的范围,则后者会有所帮助:
df.set_index(['p1', 'p2']).loc[(2, 'b')]
p3 score
p1 p2
2 b t1 0.579199
b t2 0.785301
b t3 0.339372
答案 2 :(得分:1)
oneliner:按p1和p2分组,取每个组的得分列的平均值。获取聚合系列中最大值的id。
df.groupby(['p1', 'p2'])['score'].agg(lambda x: x.mean()).idxmax()
>>> ('2', 'b')