Фильтровать фрейм данных pandas, если размер группы больше 1

#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'])
  

Как мне выполнить следующую логику агрегирования (с той же структурой вывода):

  1. Выберите только isPrefferdName , если в группе более 1 значения.
  2. Выберите первое значение, если такого флага нет.
  3. Не уверен, возможно ли объединить с # 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