#pandas #dataframe #aggregate
#pandas #фрейм данных #агрегировать
Вопрос:
Имея следующий фрейм данных, который сгруппирован:
df = pd.DataFrame({
'geonameid': ['1814991', '1814991', '3508796', '3508796', '3017382', '2017370', '2017370'],
'isolanguage': ['de', 'de', 'de', 'de', 'de', 'de', 'de'],
'alternate_name': ['China', 'Volksrepublik China', 'Dominikanische Republik', 'Dom. Republik', 'Frankreich', 'Russische Föderation', 'Russland'],
'isPreferredName': ['', '', '1', '', '', '', '1'],
'isShortName': ['1', '', '', '1', '', '', '']
})
grouped = df.groupby(['geonameid', 'isolanguage'])
Как мне выполнить следующую логику агрегирования (с той же структурой вывода):
- Выберите только
isPrefferdName
, если в группе более 1 значения. - Выберите первое значение, если такого флага нет.
- Не уверен, возможно ли объединить с # 1, выберите
isShortName
, если в группе более 1 значения.
Как мне написать какую-либо логику вокруг функции агрегирования?
df = df.groupby(['geonameid', 'isolanguage']).agg(
{ 'alternate_name': lambda series: list(series)[0] })
Preferred output: China, Dominikanische Republik, Frankreich, Russland.
Спасибо за любую помощь!
Ответ №1:
IIUC просто sort
isPrefferdName
и isShortName
:
print (df.sort_values(["isPreferredName", "isShortName"], ascending=False)
.groupby(['geonameid', 'isolanguage'])["alternate_name"].first())
geonameid isolanguage
1814991 de China
2017370 de Russland
3017382 de Frankreich
3508796 de Dominikanische Republik