Pandas DataFrame-найти строку, где значения для столбца максимальны



Как я могу найти строку, для которой значение определенного столбца maximal?



df.max() даст мне максимальное значение для каждого столбца, я не знаю, как получить соответствующие строки.

3619   5  

5 ответов:

вам просто нужно argmax() (теперь называется idxmax функция). Это просто:

>>> import pandas
>>> import numpy as np
>>> df = pandas.DataFrame(np.random.randn(5,3),columns=['A','B','C'])
>>> df
          A         B         C
0  1.232853 -1.979459 -0.573626
1  0.140767  0.394940  1.068890
2  0.742023  1.343977 -0.579745
3  2.125299 -0.649328 -0.211692
4 -0.187253  1.908618 -1.862934
>>> df['A'].argmax()
3
>>> df['B'].argmax()
4
>>> df['C'].argmax()
1

эта функция была обновлена на имя idxmax в API Pandas, хотя по состоянию на Pandas 0.16,argmax все еще существует и выполняет ту же функцию (хотя, кажется, работает медленнее, чем idxmax).

вы также можете просто использовать numpy.argmax, например numpy.argmax(df['A']) -- он обеспечивает то же самое, что и любой из двух pandas функции и по крайней мере так быстро, как idxmax в беглых наблюдений.

ранее (как отмечается в комментариях) оказалось, что argmax будет существовать как отдельная функция, которая предоставила целое положение в индексе расположения строки максимального элемента. Например, если у вас есть строковые значения в качестве меток индекса, например строки " a "через " e", вы можете знать, что max встречается в строке 4 (а не в строке "d"). Тем не менее, в панд 0.16, все перечисленные методы, прежде всего, обеспечивают метка С Index для рассматриваемой строки, и если вы хотите целое число позиции этой метки в Index вы должны получить его вручную (что может быть сложно теперь, когда повторяющиеся метки строк разрешены).

в общем, я думаю, что до idxmax-подобное поведение для всех трех подходов (argmax, который все еще существует,idxmax и numpy.argmax) это плохо, так как очень часто требуется позиционное целое расположение максимальное, возможно, даже более распространенное, чем желая метка этого позиционного расположения в пределах некоторого индекса, особенно в приложениях, где повторяющиеся метки строк являются общими.

например, рассмотрим эту игрушку DataFrame С повторяющейся меткой строки:

In [19]: dfrm
Out[19]: 
          A         B         C
a  0.143693  0.653810  0.586007
b  0.623582  0.312903  0.919076
c  0.165438  0.889809  0.000967
d  0.308245  0.787776  0.571195
e  0.870068  0.935626  0.606911
f  0.037602  0.855193  0.728495
g  0.605366  0.338105  0.696460
h  0.000000  0.090814  0.963927
i  0.688343  0.188468  0.352213
i  0.879000  0.105039  0.900260

In [20]: dfrm['A'].idxmax()
Out[20]: 'i'

In [21]: dfrm.ix[dfrm['A'].idxmax()]
Out[21]: 
          A         B         C
i  0.688343  0.188468  0.352213
i  0.879000  0.105039  0.900260

так вот наивное использование idxmax недостаточно, тогда как старая форма argmax будет правильно указать!--23-->позиционные расположение максимальной строки (в этом случае, позиция 9).

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

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

вы также можете попробовать idxmax:

In [5]: df = pandas.DataFrame(np.random.randn(10,3),columns=['A','B','C'])

In [6]: df
Out[6]: 
          A         B         C
0  2.001289  0.482561  1.579985
1 -0.991646 -0.387835  1.320236
2  0.143826 -1.096889  1.486508
3 -0.193056 -0.499020  1.536540
4 -2.083647 -3.074591  0.175772
5 -0.186138 -1.949731  0.287432
6 -0.480790 -1.771560 -0.930234
7  0.227383 -0.278253  2.102004
8 -0.002592  1.434192 -1.624915
9  0.404911 -2.167599 -0.452900

In [7]: df.idxmax()
Out[7]: 
A    0
B    8
C    7

например

In [8]: df.loc[df['A'].idxmax()]
Out[8]: 
A    2.001289
B    0.482561
C    1.579985

Как выше ответы будут возвращать только один индекс, если есть несколько строк, которые принимают максимальное значение. Если вы хотите, чтобы все строки, там, кажется, не имеют функции. Но это не трудно сделать. Ниже приведен пример для серии; то же самое можно сделать для DataFrame:

In [1]: from pandas import Series, DataFrame

In [2]: s=Series([2,4,4,3],index=['a','b','c','d'])

In [3]: s.idxmax()
Out[3]: 'b'

In [4]: s[s==s.max()]
Out[4]: 
b    4
c    4
dtype: int64
df.iloc[df['columnX'].argmax()]

argmax() обеспечит индекс, соответствующий максимальному значению для columnX. iloc можно использовать для получения строки фрейма данных df для этого индекса.

The argmax и idmax фрейма данных возвращает индекс метки строки с максимальным значением (по крайней мере, с более новой версией pandas). Если вы хотите использовать позиционные индекс, вы можете сделать следующее:

max_row = np.argmax(df['A'].values)
df['A'].values[max_row]

здесь numpy был импортирован как np как стандартный. Обратите внимание, что если вы используете np.argmax(df['A']), используется индексация меток.

Comments

    Ничего не найдено.