#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())