2016-08-29 6 views
2

Если у меня есть эти столбцы в dataframe:Python, панды, накопленная сумма в новой колонке на соответствующие группы

a  b 
1  5 
1  7 
2  3 
1,2 3 
2  5 

Как создать столбец c где столбец b суммируется с использованием группировки колонки a (строка) , сохраняя существующую структуру данных. Некоторые строки могут принадлежать более чем одной группе.

a  b  c 
1  5  15 
1  7  15 
2  3  11 
1,2 3  26 
2  5  11 

Есть ли простое и эффективное решение, так как ядро ​​данных очень велико.

ответ

2

Вы можете сначала нужно раздвоение столбец a и join к оригинальному DataFrame:

print (df.a.str.split(',', expand=True) 
       .stack() 
       .reset_index(level=1, drop=True) 
       .rename('a')) 
0 1 
1 1 
2 2 
3 1 
3 2 
4 2 
Name: a, dtype: object 

df1 = df.drop('a', axis=1) 
     .join(df.a.str.split(',', expand=True) 
         .stack() 
         .reset_index(level=1, drop=True) 
         .rename('a')) 
print (df1) 
    b a 
0 5 1 
1 7 1 
2 3 2 
3 3 1 
3 3 2 
4 5 2 

Затем используйте transform для sum без aggragation.

df1['c'] = df1.groupby(['a'])['b'].transform(sum) 
#cast for aggreagation join working with strings 
df1['a'] = df1.a.astype(str) 
print (df1) 
    b a c 
0 5 1 15 
1 7 1 15 
2 3 2 11 
3 3 1 15 
3 3 2 11 
4 5 2 11 

Последний groupby по индексу и агрегатных колонок agg:

print (df1.groupby(level=0) 
      .agg({'a':','.join,'b':'first' ,'c':sum}) 
      [['a','b','c']]) 

    a b c 
0 1 5 15 
1 1 7 15 
2 2 3 11 
3 1,2 3 26 
4 2 5 11   
+0

Для первого шага может быть использован уже [piRSquared решение] (http://stackoverflow.com/a/38652414/2901002). – jezrael

Смежные вопросы