为特定列优化的熊猫行索引

时间:2018-08-22 16:24:11

标签: python pandas

我有一个示例数据框,如下所示

   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

p1p2p3是参数。我想做的是根据p3选择具有最大平均值的p1和p2值的最佳行。

例如,在给定的数据帧中,此函数应返回第9、10、11行之一,因为p3得分的平均值(0.579199, 0.785301, 0.339372) = 0.567958是我可以从任何数据中获取的最大值给定一组p1p2

我到目前为止的尝试(使用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')

但是,这效率非常低,并且仅适用于较小的数据帧。对于更大的数据框,我该怎么做?

3 个答案:

答案 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)

使用groupbytransform

>>> df.groupby(['p1', 'p2']).score.transform('mean').idxmax()
9

如果相反,您想要与此最大值对应的p1p2的组合:

>>> 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')