Выберите значение индекса из groupby на фреймворке pandas в python

У меня есть следующий фрейм данных:

df = pd.DataFrame({'place'     : ['A', 'B', 'C', 'D', 'E', 'F'],
               'population': [10 , 20, 30, 15, 25, 35],
               'region': ['I', 'II', 'III', 'I', 'II', 'III']})

А это выглядит так:

      place  population region
0     A          10      I
1     B          20     II
2     C          30    III
3     D          15      I
4     E          25     II
5     F          35    III

Я хотел бы выбрать место с наименьшим населением из региона с наибольшим населением.

df.groupby('region').population.sum()

Возврат:

region
I      25
II     45
III    65
Name: population, dtype: int64

Но я понятия не имею, как действовать дальше (используя .groupby / .loc / .iloc)

Любое предложение?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
2 566
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам нужно найти region с самым высоким population. Затем groupbyplace к подмножеству данных с этим регионом и найдите место с наименьшим population. (Предполагая, что место будет повторяться в реальных данных)

high_reg = df.groupby('region')['population'].sum().reset_index(name='count').sort_values('count').iloc[-1]['region']
df.loc[df['region']==high_reg].groupby('place')['population'].sum().reset_index(name='count').sort_values('count').iloc[0]['place']

Выход:

'C'
Ответ принят как подходящий

Сначала добавьте столбец для населения региона:

df['region_pop'] = df.groupby('region')['population'].transform(sum)

Затем отсортируйте фрейм данных и извлеките первую строку:

res = df.sort_values(['region_pop', 'population'], ascending=[False, True])\
        .head(1)

Результат:

  place  population region  region_pop
2     C          30    III          65

Я считаю, что это будет быстрее, чем мое решение. +1 :)

harvpan 20.06.2018 17:10

Спасибо, приятно! Есть ли способ сделать это одной строкой кода (с цепочкой методов)?

Rene 20.06.2018 19:27

@Rene, наверное, но это будет нечитаемый беспорядок, который мне трудно понять.

jpp 20.06.2018 19:29

df.assign (region_population = df.groupby ('region') ['Population']. transform (sum)). sort_valu‌ es (['region_populati‌ on', 'Population'], ascending = [False, True]) .iloc [0] .place

Rene 20.06.2018 19:37

@ Рене, да, это было бы однострочным. Но не позволяйте этому заставить вас поверить в то, что он более эффективен. Вы просто перемещаете явное определение серии в pd.DataFrame.assign.

jpp 20.06.2018 19:37

Другие вопросы по теме