Как получить два наибольших значения из столбца?

Из подобного DataFrame:

df1 = pd.DataFrame({
  "Car": ['Model_1', 'Model_1', 'Model_1', 'Model_3', 'Model_1', 'Model_3', 'Model_2', 'Model_2', 'Model_2', 'Model_2', 'Model_1', 'Model_1', 'Model_1', 'Model_2', 'Model_2', 'Model_3'], 
  "City": ['Moscow', 'Moscow', 'Perm', 'Perm', 'Omsk', 'Omsk', 'Orel', 'Tula', 'Tula', 'Kazan', 'Voronez', 'Voronez', 'Voronez', 'Kazan', 'Kazan', 'Omsk']})

делаю groupby:

df2 = pd.DataFrame(df1.groupby('Car')['City'].value_counts())

и получаю такой DataFrame:

введите сюда описание изображения

Как мне из него получить топ-2 значения столбца City и расположить их по-столбцам?

введите сюда описание изображения

Спасибо, за помощь!


Ответы (1 шт):

Автор решения: MaxU
df1 = pd.DataFrame({
  "Car": ['Model_1', 'Model_1', 'Model_1', 'Model_3', 'Model_1', 'Model_3', 'Model_2', 'Model_2', 'Model_2', 'Model_2', 'Model_1', 'Model_1', 'Model_1', 'Model_2', 'Model_2', 'Model_3'], 
  "City": ['Moscow', 'Moscow', 'Perm', 'Perm', 'Omsk', 'Omsk', 'Orel', 'Tula', 'Tula', 'Kazan', 'Voronez', 'Voronez', 'Voronez', 'Kazan', 'Kazan', 'Omsk']})

r = df1.groupby("Car")["City"].apply(lambda x: x.value_counts().head(2))
res = (r
       .reset_index()
       .assign(top=["Top_1", "Top_2"] * df1["Car"].nunique())
       .pivot(index="Car", columns="top", values="City")
       .rename_axis(None)
       .rename_axis(None, axis=1))

результат:

In [73]: res
Out[73]:
         Top_1  Top_2
Model_1      3      2
Model_2      3      2
Model_3      2      1
→ Ссылка