Эффективно обрабатывать группу pandas

#python #pandas #dataframe #pandas-groupby

#python #pandas #фрейм данных #pandas-groupby

Вопрос:

У меня есть фрейм данных df со столбцами a, b, c, d и e. Чего я хочу, так это группировать по df на основе a, b и c. И затем для каждой группы я хочу удалить нулевое значение столбцов d и e с наиболее частым значением этого столбца в этой группе. И затем, наконец, удалите дубликаты для каждой группы.

Я выполняю следующую обработку:

         final_df = pd.DataFrame()
        grouped = df.groupby(['a', 'b', 'c'])
        for _, group in grouped:
            group = group.replace('', np.nan)
            group = group.fillna(group.mode().iloc[0])
            group.drop_duplicates(keep='first', inplace=True)
            final_df = pd.concat([rows_to_insert, final_df])
  

Но итерация делает мою обработку действительно очень медленной. Может кто-нибудь предложить мне лучший способ сделать это?

Пример ввода:

 a   b   c   d       e
a1  b1  c1  NULL    e2
a2  b2  c2  NULL    NULL
a2  b2  c2  NULL    NULL
a1  b1  c3  d4      e4
a1  b1  c1  NULL    e2
a1  b1  c1  d1      e2
a1  b1  c1  d1     NULL

  

Пример вывода:

 a   b   c   d         e
a1  b1  c1  d1      e2
a2  b2  c2  NULL    NULL
a1  b1  c3  d4      e4

  

Ответ №1:

Вы хотите groupby().mode с уловом, когда все данные NaN :

 def get_mode(series):
    out = series.mode()
    return out.iloc[0] if len(out) else np.nan

df.groupby(['a','b','c'], as_index=False, sort=False).agg(get_mode)
  

Вывод:

     a   b   c    d    e
0  a1  b1  c1   d1   e2
1  a2  b2  c2  NaN  NaN
2  a1  b1  c3   d4   e4
  

И если вы хотите заполнить свой исходный фрейм данных режимом:

 df[['d','e']] = df.groupby(['a','b','c']).transform(get_mode)
  

Вывод:

     a   b   c    d    e
0  a1  b1  c1   d1   e2
1  a2  b2  c2  NaN  NaN
2  a2  b2  c2  NaN  NaN
3  a1  b1  c3   d4   e4
4  a1  b1  c1   d1   e2
5  a1  b1  c1   d1   e2
6  a1  b1  c1   d1   e2