Найдите максимальное значение столбца и верните соответствующие значения строки с помощью Pandas


121

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

Используя 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()

Спасибо. Это было именно то, что я искал.
Ричи

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

Это вернет всю строку с максимальным значением


Объяснение: - Внутреннее выражение делает булеву проверка по всей длине dataFrame & этот индексу , который удовлетворяет правая часть выражения (.max ()) возвращает индекс, который , в свою очередь , вызывает полную строку этого dataFrame
пент

11

Страна и место - это индекс серии, если вам не нужен индекс, вы можете установить as_index=False:

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

Редактировать:

Кажется, вам нужно место с максимальным значением для каждой страны, следующий код сделает то, что вы хотите:

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

что бы вернуть только имена столбцов и dtypes
Richie

9

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

index = df.Value.argmax()

Теперь индекс можно использовать для получения функций для этой конкретной строки:

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

8

Используйте 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»
Ричи

Спасибо. Это решит проблему для текущего набора данных, в котором есть только 1 столбец со значениями. Когда есть больше столбцов со значениями, решение @unutbu будет работать лучше. Спасибо, в любом случае.
Ричи

5

Чтобы напечатать страну и место с максимальным значением, используйте следующую строку кода.

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


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.