Как сгруппировать несколько колонок по одинаковым значениям и сделать sum и count в pandas

Рейтинг: 1Ответов: 2Опубликовано: 20.06.2023

Есть df, с такими данными:

name_0 name_1 name_2 day
Катя Ира Аня 1
Ира Лена Катя 0
Настя Оля Катя 2

Помогите, пожалуйста, не могу понять, как сгруппировать колонки и посчитать sum и count, чтобы получить новый df следующего вида:

name sum_day count_name count_day
Катя 3 3 3
Ира 1 2 3
Настя 2 1 3
Лена 0 1 3
Оля 2 1 3
Аня 1 1 3

Ответы

▲ 4Принят

С помощью .groupby. Вот пример:

import pandas as pd

# Создаем исходный DataFrame
df = pd.DataFrame({'name_0': ['Катя', 'Ира', 'Настя'], 
                   'name_1': ['Ира', 'Лена', 'Оля'], 
                   'name_2': ['Аня', 'Катя', 'Катя'], 
                   'day': [1, 0, 2]})

# Объединяем столбцы name_0, name_1, name_2 в один столбец name
df = df.melt(id_vars='day', value_vars=['name_0', 'name_1', 'name_2'])
df.rename(columns={'value': 'name'}, inplace=True)
df.drop('variable', axis=1, inplace=True)

# Группируем по именам
grouped = df.groupby('name').agg({'day': 'sum', 'name': 'count'}).rename(columns={'day': 'sum_day', 'name': 'count_name'})

result = grouped.sort_values('count_name', ascending=False)

print(result.to_markdown())
▲ 1

Можно разделить датафрейм на 3 поддатафрейма для каждого столбца name_x, а затем обьеденить в 1 датафрейм из 2 столбцов, а далее использовать groupby:

df = pd.DataFrame({'name_0':['Катя', 'Ира', 'Настя'],
                   'name_1':['Ира', 'Лена', 'Оля'],
                   'name_2':['Аня', 'Катя', 'Катя'],
                   'day':[1, 0, 2]})

df_0 = df[['name_0', 'day']].copy()
df_1 = df[['name_1', 'day']].copy()
df_2 = df[['name_2', 'day']].copy()

df_0  = df_0.rename(columns={'name_0': 'name'})
df_1  = df_1.rename(columns={'name_1': 'name'})
df_2  = df_2.rename(columns={'name_2': 'name'})

df_all = pd.concat([df_0, df_1], ignore_index=True, axis=0)
df_all = pd.concat([df_all, df_2], ignore_index=True, axis=0)

df_group = df_all.groupby('name').agg(['sum', 'count']).reset_index().copy()
df_group = df_group.rename(columns={'sum': 'sum_day', 'count': 'count_name'})

df_group['count_day'] = len(df['day'])

df_group