2016-08-29 46 views
2

如果我有一個數據幀這些列:Python中,大熊貓,在新列累積和匹配組

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

如何創造一個列b使用列a(串)的分組總結列c ,保持現有的數據幀。某些行可以屬於多個組。

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

是否有一個簡單高效的解決方案,因爲我擁有的數據幀非常大。

回答

2

您可以首先需要分列ajoin它原來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 

然後使用transformsum沒有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