Використовуйте функцію панди 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()
повертає мітки індексів, а не цілі числа.
- Приклад ': якщо у вас вказуються рядкові значення в якості міток індексу, як рядки' а 'через' е ', ви, можливо, захочете знати, що максимум виникає у рядку 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
може тільки повідомте про мітку максимального рядка, а потім розчаруєтесь, що жодна стандартна функція автоматично не отримує для вас позиції максимальної рядки, самостійно записуючи помилкову реалізацію, редагуючи код і молячись, щоб ви знову не стикалися з проблемою.