2016-12-15 2 views
1

У меня есть таблица в панд ФРГруппировка нескольких столбцов и сумма подсчета в панд ФР

master_id pidx pidy flag count 
    xxx  a  b  A  10 
    xxx  a  c  A  20 
    xxx  a  d  A  30 
    xxx  b  d  A  40 
    xxx  a  c  C  50 
    xxx  a  c  C  60 
    xxx  x  y  C  70 
    xxx  x  y  C  80 

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

т.е.

xxx a c A 20 
xxx a c C 50 
xxx a c C 60 

конечный результат должен быть

xxx a c A 130 

финальный стол должен быть

master_id pidx pidy flag count 
    xxx  a  b  A  10 
    xxx  a  c  A  130 
    xxx  a  d  A  30 
    xxx  b  d  A  40 
    xxx  x  y  C  150 

ответ

2

Я думаю, что вам нужно groupby с agg - колонки flag является агрегат по first и колонки count по sum:

df = df.groupby(['pidx','pidy']).agg({'flag':'first', 'count':'sum'}).reset_index() 
print (df) 
    pidx pidy count flag 
0 a b  10 A 
1 a c 130 A 
2 a d  30 A 
3 b d  40 A 
4 x y 150 C 

, потому что, если использовать groupby по pidx, pidy и flag, выход отличается:

df = df.groupby(['pidx','pidy','flag'], as_index=False)['count'].sum() 
print (df) 
    pidx pidy flag count 
0 a b A  10 
1 a c A  20 
2 a c C 110 
3 a d A  30 
4 b d A  40 
5 x y C 150 
+0

ваш код работает, но говорят, что у меня есть еще один столбец говорят master_id, то я могу» t добавьте этот столбец в 'df.groupby (['master_id', 'pidx', 'pidy'])' См., что я редактировал свой df с другим столбцом. – Shubham

+0

Я помещаю leafID внутри функции agg и, похоже, работает: 'df = df.groupby (['pidx', 'pidy']). Agg ({'leafId': 'first', 'flag': 'first', ' 'count': 'sum'}). reset_index() ', но это правильный путь? – Shubham

+0

Это зависит от того, что вам нужно. Если нужна группа по столбцам pydx и pidy и получить первую строку столбца leafId и флаг и суммировать все строки в столбце count, вы правы. – jezrael