п высших значений в кадре данных - PullRequest
3 голосов
/ 19 апреля 2019

У меня есть кадр данных панд, как:

        column0     column1     column2     column3     column4
row0    179319.0    180895.0    94962.0     130734.0    0
row1    89659.5     90447.5     47481.0     65367.0     0
row2    59773.0     60298.33333 31654.0     43578.0     0
row3    44829.75    45223.75    23740.5     32683.5     0
row4    35863.8     36179.0     18992.4     26146.8     0
row5    29886.5     30149.16666 15827.0     21789.0     0
row6    25617.0     25842.14285 13566.0     18676.28571 0
row7    22414.875   22611.875   11870.25    16341.75    0
row8    19924.33333 20099.44444 10551.33333 14526.0     0

и я хотел бы получить что-то вроде индекса из 9 (количество строк) старших значений или что-то вроде количества старших значений для каждого столбца, например:

column0  column1  column2  column3  column4
3        3        1        2        0

В моем примере 9 самых высоких значений будут из column0, column1, column2 и column3 из row0, из column0, column1 и column3 из row1 и из column0 и column1 из row2.

Есть идеи? Спасибо!

Ответы [ 4 ]

7 голосов
/ 19 апреля 2019

IIUC nlargest после stack

df.stack().nlargest(9).groupby(level=1).count().reindex(df.columns,fill_value=0)
Out[48]: 
column0    3
column1    3
column2    1
column3    2
column4    0
dtype: int64
3 голосов
/ 19 апреля 2019

IIUC, можно складывать и сортировать,

df.stack().sort_values(ascending = False).iloc[:9]

row0  column1    180895.00000
      column0    179319.00000
      column3    130734.00000
      column2     94962.00000
row1  column1     90447.50000
      column0     89659.50000
      column3     65367.00000
row2  column1     60298.33333
      column0     59773.00000
0 голосов
/ 19 апреля 2019

Вот решение, использующее np + collections.Counter, которое должно быть довольно быстрым для получения объекта Counter.

from collections import Counter
import numpy as np
import pandas as pd

c = Counter(np.tile(df.columns, df.shape[0])[np.argsort(df.to_numpy().ravel())[-9:]])
#Counter({'column0': 3, 'column1': 3, 'column2': 1, 'column3': 2})

s = pd.Series(c).reindex(df.columns).fillna(0).astype(int)
#column0    3
#column1    3
#column2    1
#column3    2
#column4    0
#dtype: int32
0 голосов
/ 19 апреля 2019

pandas имеет функцию с именем nlargest, которая будет возвращать самые большие значения любого столбца в виде ряда. [документы]

Если вам нужен только индекс каждого, вы должны использовать index.values [использование] [документы] иливы можете использовать .index.array, как рекомендовано в документах .

Если вы хотите подсчитать все самые высокие значения, посмотрите этот ответ здесь .

...