2017-02-15 5 views
1

Мне нужно сгруппировать элементы и суммировать их с одним столбцом.Pandas: сумма значений в некотором столбце

member_id event_path event_duration 
0  111  vk.com    1 
1  111 twitter.com    4 
2  111 facebook.com    56 
3  111  vk.com    23 
4  222  vesti.ru    6 
5  222 facebook.com    23 
6  222  vk.com    56 
7  333  avito.ru    8 
8  333  avito.ru    4 
9  444  mail.ru    7 
10  444  vk.com    20 
11  444  yandex.ru    40 
12  111  vk.com     10 
13  222  vk.com     20 

И Я не хочу унифицировать member_id и event_path и сумму event_duration. Желание выход

 member_id event_path event_duration 
0  111  vk.com    34 
1  111 twitter.com    4 
2  111 facebook.com    56 
4  222  vesti.ru    6 
5  222 facebook.com    23 
6  222  vk.com    76 
7  333  avito.ru    12 
9  444  mail.ru    7 
10  444  vk.com    20 
11  444  yandex.ru    40 

Я использую

df['event_duration'] = df.groupby(['member_id', 'event_path'])['event_duration'].transform('sum') 

, но я получаю

member_id event_path event_duration 
0  111  vk.com    34 
1  111 twitter.com    4 
2  111 facebook.com    56 
3  111  vk.com    34 
4  222  vesti.ru    6 
5  222 facebook.com    23 
6  222  vk.com    76 
7  333  avito.ru    12 
8  333  avito.ru    12 
9  444  mail.ru    7 
10  444  vk.com    20 
11  444  yandex.ru    40 
12  111  vk.com    34 
13  222  vk.com    76 

Что я делаю не так?

ответ

3

Вам необходимо groupby с параметрами sort=False и as_index=False с агрегацией sum:

df = df.groupby(['member_id','event_path'],sort=False,as_index=False)['event_duration'].sum() 
print (df) 
    member_id event_path event_duration 
0  111  vk.com    34 
1  111 twitter.com    4 
2  111 facebook.com    56 
3  222  vesti.ru    6 
4  222 facebook.com    23 
5  222  vk.com    76 
6  333  avito.ru    12 
7  444  mail.ru    7 
8  444  vk.com    20 
9  444  yandex.ru    40 

Другим возможным решением является добавление reset_index:

df = df.groupby(['member_id', 'event_path'],sort=False)['event_duration'].sum().reset_index() 
print (df) 
    member_id event_path event_duration 
0  111  vk.com    34 
1  111 twitter.com    4 
2  111 facebook.com    56 
3  222  vesti.ru    6 
4  222 facebook.com    23 
5  222  vk.com    76 
6  333  avito.ru    12 
7  444  mail.ru    7 
8  444  vk.com    20 
9  444  yandex.ru    40 

Функция transform используется для добавления агрегированного расчета назад к исходному df в качестве нового столбца.

1

Что вы делаете неправильно, так это то, что вы пытаетесь назначить его столбцу в исходном фрейме. И поскольку ваш новый столбец имеет меньше строк, чем исходный фреймворк данных, он повторяется в конце.