Создайте временный столбец для агрегации

#python #pandas

#python #pandas

Вопрос:

Допустим, я создаю следующий (временный) столбец для агрегации:

 df['count_of_source_videos'] = np.where(df['is_main_video'] amp; df['file_name'].str.contains('DIGITAL_SOURCE'), 1, 0)
  

А затем часть агрегации:

 summary_df = df.groupby(['provider', 'id']).agg(
  num_source_videos = ('count_of_source_videos', 'sum'),
).reset_index()
  

При описанном выше подходе столбец count_of_source_videos остается там постоянно. Есть ли способ выполнить агрегацию без добавления нового столбца? Если да, то как это можно сделать?

Ответ №1:

Вы можете использовать .rename() в существующем столбце вместо создания нового столбца:

 df['count_of_source_videos'] = np.where(df['is_main_video'] amp;
                                 df['file_name'].str.contains('DIGITAL_SOURCE'),
                                 1, 0)
summary_df = (df.groupby(['provider', 'id'])['count_of_source_videos'].sum()
                .rename('num_source_videos').reset_index())
  

или однострочный:

 summary_df = (df.assign(count_of_source_videos=
                        np.where(df['is_main_video'] amp;
                                 df['file_name'].str.contains('DIGITAL_SOURCE'),
                                 1, 0))
                .groupby(['provider', 'id'])['count_of_source_videos'].sum()
                .rename('num_source_videos').reset_index())
  

Комментарии:

1. Я понимаю, как насчет того, чтобы вообще не иметь первой строки и выполнять функцию внутри (...) , или это невозможно?

2. @David542 способ, которым я это сделал, требует суммирования уже существующего столбца. Вы можете сделать это «однострочным», .assign хотя:

Ответ №2:

Попробуйте это:

 s = df['is_main_video'] amp; df['file_name'].str.contains('DIGITAL_SOURCE')
summary_df = s.groupby([df.provider, df.id]).agg(num_source_videos = 'sum').reset_index()
  

Если вы не хотите создавать временную серию s , вы можете связать ее в цепочку, но она будет менее читаемой

 summary_df = ((df['is_main_video'] amp; df['file_name'].str.contains('DIGITAL_SOURCE'))
                      .groupby([df.provider, df.id])
                      .agg(num_source_videos = 'sum').reset_index())