Знайдіть максимальне значення стовпця та поверніть відповідні значення рядків за допомогою Pandas


118

Структура даних;

Використовуючи Python Pandas, я намагаюся знайти Country& Placeз максимальним значенням.

Це повертає максимальне значення:

data.groupby(['Country','Place'])['Value'].max()

Але як мені отримати відповідне Countryта Placeім’я?

Відповіді:


170

Припускаючи, що dfмає унікальний індекс, це дає рядок з максимальним значенням:

In [34]: df.loc[df['Value'].idxmax()]
Out[34]: 
Country        US
Place      Kansas
Value         894
Name: 7

Зверніть увагу, що idxmaxповертає мітки індексу . Отже, якщо DataFrame має дублікати в індексі, мітка може не однозначно ідентифікувати рядок, тому df.locможе повернути більше одного рядка.

Тому, якщо dfвін не має унікального індексу, ви повинні зробити індекс унікальним, перш ніж продовжувати, як зазначено вище. Залежно від DataFrame, іноді ви можете використовувати stackабо set_indexзробити індекс унікальним. Або ви можете просто скинути індекс (таким чином, рядки перенумеруються, починаючи з 0):

df = df.reset_index()

Дякую. Саме це я і шукав.
richie

56
df[df['Value']==df['Value'].max()]

Це поверне весь рядок із максимальним значенням


Пояснення: - Внутрішнє вираз робить булеву перевірка по всій довжині dataFrame & цей індексу , який задовольняє права частина виразу (.max ()) повертає індекс, який , в свою чергу , викликає повну рядок цього dataFrame
пент

10

Країна та місце - це індекс серії, якщо індекс не потрібен, ви можете встановити as_index=False:

df.groupby(['country','place'], as_index=False)['value'].max()

Редагувати:

Здається, що ви хочете, щоб місце з максимальним значенням для кожної країни було виконано наступним кодом:

df.groupby("country").apply(lambda df:df.irow(df.value.argmax()))

що повертає лише назви стовпців та типи
richie

8

Я думаю, що найпростіший спосіб повернути рядок з максимальним значенням - отримати його індекс. argmax()можна використовувати для повернення індексу рядка з найбільшим значенням.

index = df.Value.argmax()

Тепер індекс може бути використаний для отримання функцій для конкретного рядка:

df.iloc[df.Value.argmax(), 0:2]

7

Використовуйте indexатрибут DataFrame. Зауважте, що я не ввожу всі рядки в прикладі.

In [14]: df = data.groupby(['Country','Place'])['Value'].max()

In [15]: df.index
Out[15]: 
MultiIndex
[Spain  Manchester, UK     London    , US     Mchigan   ,        NewYork   ]

In [16]: df.index[0]
Out[16]: ('Spain', 'Manchester')

In [17]: df.index[1]
Out[17]: ('UK', 'London')

Ви також можете отримати значення за цим індексом:

In [21]: for index in df.index:
    print index, df[index]
   ....:      
('Spain', 'Manchester') 512
('UK', 'London') 778
('US', 'Mchigan') 854
('US', 'NewYork') 562

Редагувати

Вибачте за нерозуміння того, що ви хочете, спробуйте наступні дії:

In [52]: s=data.max()

In [53]: print '%s, %s, %s' % (s['Country'], s['Place'], s['Value'])
US, NewYork, 854

правильно. Але я шукаю вихідний рядок, який говорить: "США, Канзас, 894"
richie

Дякую. Це дозволить вирішити проблему для поточного набору даних, де є лише 1 стовпець зі значеннями. Коли буде більше стовпців із значеннями @ @ unutbu, рішення буде працювати краще. Все одно, дякую.
richie

5

Щоб надрукувати країну та місце з максимальним значенням, використовуйте наступний рядок коду.

print(df[['Country', 'Place']][df.Value == df.Value.max()])

2

Моє рішення для пошуку максимальних значень у стовпцях:

df.ix[df.idxmax()]

, також мінімум:

df.ix[df.idxmin()]

2

Я рекомендую використовувати nlargestдля кращої продуктивності та скорочення коду. імпортpandas

df[col_name].value_counts().nlargest(n=1)


2

import pandas
df - це створений вами кадр даних.

Використовуйте команду:

df1=df[['Country','Place']][df.Value == df['Value'].max()]

Це відобразить країну та місце, значення якого максимальне.


0

Я зіткнувся з подібною помилкою під час спроби імпорту даних за допомогою панд. Перший стовпець у моєму наборі даних мав пробіли до початку слів. Я видалив пробіли, і це спрацювало як шарм !!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.