Агрегация в строковом режиме с группировкой по функциям - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть датафрейм, который выглядит следующим образом

Country  City
UK       London
USA      Washington
UK       London
UK       Manchester
USA      Washington
USA      Chicago

Я хочу сгруппировать страну и агрегировать по наиболее повторяющимся городам в стране

Мой желаемый результат должен быть как

Country City
UK      London
USA     Washington

Потому что Лондон и Вашингтон появляются 2 раза, тогда как Манчестер и Чикаго появляются только 1 раз.

Я пытался

from scipy.stats import mode
df_summary = df.groupby('Country')['City'].\
                        apply(lambda x: mode(x)[0][0]).reset_index()

Но, похоже, он выиграл 'т работает на струнах

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Попробуйте, как показано ниже:

>>> df.City.mode()
0        London
1    Washington
dtype: object

ИЛИ

import pandas as pd
from scipy import stats

Можно использовать scipy с stats + lambda:

df.groupby('Country').agg({'City': lambda x:stats.mode(x)[0]})
               City
Country
UK           London
USA      Washington

#  df.groupby('Country').agg({'City': lambda x:stats.mode(x)[0]}).reset_index()

ОднакоЭто также дает хороший счетчик, если вы не хотите возвращать только первое значение:

>>> df.groupby('Country').agg({'City': lambda x:stats.mode(x)})
                        City
Country
UK           ([London], [2])
USA      ([Washington], [2])
0 голосов
/ 22 ноября 2018

Я не могу воспроизвести вашу ошибку, но вы можете использовать pd.Series.mode, которая принимает строки и возвращает серию, используя iat для извлечения первого значения:

res = df.groupby('Country')['City'].apply(lambda x: x.mode().iat[0]).reset_index()

print(res)

  Country        City
0      UK      London
1     USA  Washington
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...