У меня есть следующий фрейм данных:
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)
Любое предложение?






Вам нужно найти 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
Спасибо, приятно! Есть ли способ сделать это одной строкой кода (с цепочкой методов)?
@Rene, наверное, но это будет нечитаемый беспорядок, который мне трудно понять.
df.assign (region_population = df.groupby ('region') ['Population']. transform (sum)). sort_valu es (['region_populati on', 'Population'], ascending = [False, True]) .iloc [0] .place
@ Рене, да, это было бы однострочным. Но не позволяйте этому заставить вас поверить в то, что он более эффективен. Вы просто перемещаете явное определение серии в pd.DataFrame.assign.
Я считаю, что это будет быстрее, чем мое решение. +1 :)