2016-08-29 4 views
2

私はこれらのデータフレームの列がある場合:私は、列bが列a(文字列)のグループ化を使用して加算されて列cを作成するにはどうすればよいパイソン、パンダ、一致するグループに新しい列の累積合計

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

を既存のデータフレームを維持します。行の中には複数のグループに属するものがあります。

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

データフレームが非常に大きいので、簡単で効率的なソリューションがありますか?

答えて

2

あなたはまず、元DataFrameに分割列ajoinそれを必要とすることができます

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 

その後aggragationなしsumためtransformを使用しています。 aggによって

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

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