pandas idxmax:如果有关系则返回所有行

Pra*_*ras 7 python performance pandas argmax

我正在使用一个数据框,其中我按概率对每一行进行加权。现在,我想选择概率最高的行,我使用 pandas idxmax() 来这样做,但是当有平局时,它只返回平局中的第一行。就我而言,我想获取所有 tie 的行

此外,作为研究项目的一部分,我正在这样做,我正在处理数百万个如下所示的数据帧,因此保持快速是一个问题。

例子:

我的数据如下所示:

data = [['chr1',100,200,0.2],
    ['ch1',300,500,0.3],
    ['chr1', 300, 500, 0.3],
    ['chr1', 600, 800, 0.3]]
Run Code Online (Sandbox Code Playgroud)

从这个列表中,我创建了一个 Pandas 数据框,如下所示:

weighted = pd.DataFrame.from_records(data,columns=['chrom','start','end','probability'])
Run Code Online (Sandbox Code Playgroud)

看起来像这样:

  chrom  start  end  probability
0  chr1    100  200          0.2
1   ch1    300  500          0.3
2  chr1    300  500          0.3
3  chr1    600  800          0.3
Run Code Online (Sandbox Code Playgroud)

然后使用以下方法选择适合 argmax(probability) 的行:

selected =  weighted.ix[weighted['probability'].idxmax()]
Run Code Online (Sandbox Code Playgroud)

哪个当然返回:

chrom          ch1
start          300
end            500
probability    0.3
Name: 1, dtype: object
Run Code Online (Sandbox Code Playgroud)

当有关系时,是否有(快速)方法来获取所有值?

谢谢!

zip*_*ipa 7

好吧,这可能是您正在寻找的解决方案:

weighted.loc[weighted['probability']==weighted['probability'].max()].T
#               1     2     3
#chrom        ch1  chr1  chr1
#start        300   300   600
#end          500   500   800
#probability  0.3   0.3   0.3
Run Code Online (Sandbox Code Playgroud)


jpp*_*jpp 7

瓶颈在于计算布尔索引器。pd.Series您可以通过使用底层 NumPy 数组执行计算来绕过与对象相关的开销:

\n\n
df2 = df[df['probability'].values == df['probability'].values.max()]\n
Run Code Online (Sandbox Code Playgroud)\n\n

与 Pandas 等效的性能基准测试:

\n\n
# tested on Pandas v0.19.2, Python 3.6.0\n\ndf = pd.concat([df]*100000, ignore_index=True)\n\n%timeit df['probability'].eq(df['probability'].max())               # 3.78 ms per loop\n%timeit df['probability'].values == df['probability'].values.max()  # 416 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n