pandas idxmax: вернуть все строки в случае связей - PullRequest
0 голосов
/ 01 октября 2018

Я работаю с фреймом данных, где у меня есть вес каждой строки по вероятности.Теперь я хочу выбрать строку с наибольшей вероятностью и для этого использую pandas idxmax (), однако, когда есть связи, он просто возвращает первую строку среди тех, которые связывают.В моем случае Я хочу получить все строки, которые связывают .

Кроме того, я делаю это в рамках исследовательского проекта, в котором я обрабатываю миллионы фреймов данных, подобных приведенному ниже, поэтому проблема заключается в том, чтобы поддерживать его быстрым.

Пример:

Мои данные выглядят так:

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 (вероятности), используя:

selected =  weighted.ix[weighted['probability'].idxmax()]

Что, конечно, возвращает:

chrom          ch1
start          300
end            500
probability    0.3
Name: 1, dtype: object

Есть ли (быстрый) способ получить все значениякогда есть галстуки?

спасибо!

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Узкое место заключается в вычислении логического индексатора.Вы можете обойти накладные расходы, связанные с 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
0 голосов
/ 01 октября 2018

Ну, это может быть решение, которое вы ищете:

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
...