Как сгруппировать несколько колонок по одинаковым значениям и сделать sum и count в pandas
Есть 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 |
Ответы (2 шт):
Автор решения: gord1402
→ Ссылка
С помощью .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())
Автор решения: Step1709
→ Ссылка
Можно разделить датафрейм на 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