python - pandas idxmax:在平局的情况下返回所有行
问题描述
我正在使用一个数据框,其中我按其概率对每一行进行加权。现在,我想选择概率最高的行,并且我正在使用 pandas idxmax() 来执行此操作,但是当有平局时,它只会返回平局中的第一行。就我而言,我想获取所有 tie 的行。
此外,我这样做是作为研究项目的一部分,我正在处理数百万个如下所示的数据帧,因此保持快速是一个问题。
例子:
我的数据如下所示:
data = [['chr1',100,200,0.2],
['ch1',300,500,0.3],
['chr1', 300, 500, 0.3],
['chr1', 600, 800, 0.3]]
从这个列表中,我创建了一个 pandas 数据框,如下所示:
weighted = pd.DataFrame.from_records(data,columns=['chrom','start','end','probability'])
看起来像这样:
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
然后使用以下命令选择适合 argmax(probability) 的行:
selected = weighted.ix[weighted['probability'].idxmax()]
当然返回:
chrom ch1
start 300
end 500
probability 0.3
Name: 1, dtype: object
当有关系时,是否有一种(快速)方法来获取所有值?
谢谢!
解决方案
瓶颈在于计算布尔索引器。pd.Series
您可以通过使用底层 NumPy 数组执行计算来绕过与对象相关的开销:
df2 = df[df['probability'].values == df['probability'].values.max()]
与 Pandas 等效的性能基准测试:
# tested on Pandas v0.19.2, Python 3.6.0
df = pd.concat([df]*100000, ignore_index=True)
%timeit df['probability'].eq(df['probability'].max()) # 3.78 ms per loop
%timeit df['probability'].values == df['probability'].values.max() # 416 µs per loop
推荐阅读
- git - csv 输出中 cloc 空白、注释、代码的总和
- python - 我希望能够使用日期找到特定的数据
- java - 重新抛出异常真实应用
- amazon-web-services - 在组织中使用 AWS Codecommit
- javascript - 在打印 div 内容时,它占用空间和空白页
- angular - “ionic cordova run android”给出了奇怪的未知错误 Ionic 2
- selenium - 是否可以使用需要 2FA 的电子邮件自动化测试用例?
- java - 无法执行字符串相等
- operating-system - 谷歌云计算引擎支持的操作系统列表
- python - 运行时出错:$ virtualenv --python=/usr/bin/python2.7
name_project