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