Используйте 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
В качестве альтернативы вы также можете использовать numpy.argmax
, например, numpy.argmax(df['A'])
- он обеспечивает то же самое и появляется по крайней мере так же быстро, как и idxmax
при поверхностных наблюдениях.
idxmax()
возвращает метки индексов, а не целые числа.
- Пример ': если в качестве меток индекса используются строковые значения, например строки от' a 'до' e ', вы можете знать, что максимальное значение происходит в строке 4 (а не в строке' d ').
- если вам нужна целочисленная позиция этой метки внутри,
Index
вы должны получить ее вручную (что может быть непросто, если разрешить дублирование меток строк).
ИСТОРИЧЕСКИЕ ЗАМЕЧАНИЯ:
idxmax()
раньше вызывался argmax()
до 0.11
argmax
устарела до 1.0.0 и полностью удалена в 1.0.0
- Начиная с Pandas 0.16,
argmax
раньше существовал и выполнял ту же функцию (хотя, казалось, работал медленнее, чем idxmax
).
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.iloc[dfrm['A'].idxmax()] # .ix instead of .iloc in older versions of pandas
Out[21]:
A B C
i 0.688343 0.188468 0.352213
i 0.879000 0.105039 0.900260
Так вот наивное использование idxmax
не является достаточным, в то время как старая форма argmax
будет правильно предоставить позиционное расположение максимального ряда (в данном случае, положение 9).
Это как раз один из тех неприятных видов поведения, склонного к ошибкам в динамически типизированных языках, который делает такие вещи такими неудачными и стоит побить мертвую лошадь. Если вы пишете системный код, и ваша система внезапно используется для некоторых наборов данных, которые не были очищены должным образом перед объединением, очень легко получить дубликаты меток строк, особенно меток строк, таких как идентификатор CUSIP или SEDOL для финансовых активов. Вы не можете легко использовать систему типов, чтобы помочь вам, и вы не сможете обеспечить уникальность индекса, не столкнувшись с неожиданно отсутствующими данными.
Таким образом, у вас остается надежда, что ваши юнит-тесты покрыли все (они этого не сделали, или, скорее всего, никто не написал никаких тестов) - иначе (скорее всего) вы просто остаетесь ждать, чтобы увидеть, не случится ли это ошибка во время выполнения, в этом случае вы , вероятно , придется идти падение много часов на сумму работы из базы данных вы выводя результаты, биться головой о стену в IPython пытается вручную воспроизвести проблему, наконец , выяснить , что это потому , что idxmax
может только сообщите метку строки max, а затем разочаровываетесь, что ни одна стандартная функция автоматически не получает позиции строки max для вас, вы сами пишете ошибочную реализацию, редактируете код и молитесь, чтобы вы больше не сталкивались с проблемой.