熊猫:加快groupby

时间:2018-06-19 13:35:11

标签: python pandas group-by

让我们假设数据框为

df=
col_1 col_2 col3 
id1   val1  1    
id2   val1  4    
id3   val1  5    
id4   val1  7    
id1   val2  3    
id2   val2  2    
id3   val2  8    
id4   val2  4    

对于每一行,我需要添加一列,其中所有其他行的总和为col3,其中

col2 == row[col2] AND col1 != row[col1]

所以我应该得到:

df=
col_1 col_2 col3 col4
id1   val1  1    16
id2   val1  4    13
id3   val1  5    12
id4   val1  7    10
id1   val2  3    14
id2   val2  2    15
id3   val2  8    9
id4   val2  4    13

我使用apply之类的方法做到了

def getVal(row, df):
    return df[(df[col1] != row[col1]) & (df[col2] == row[col2])][col3].sum()

df[col4] = df.apply(lambda x: getVal(x, df), axis = 1)

但是由于我的df>1000000行,所以要花很多时间! 有没有更好/更快的方法?

提前谢谢

2 个答案:

答案 0 :(得分:2)

将此groupbytransform结合使用,以实现单线无合并:

df['col4'] = df.groupby('col_2')['col3'].transform('sum') - df['col3']

输出:

  col_1 col_2  col3  col4
0   id1  val1     1    16
1   id2  val1     4    13
2   id3  val1     5    12
3   id4  val1     7    10
4   id1  val2     3    14
5   id2  val2     2    15
6   id3  val2     8     9
7   id4  val2     4    13

答案 1 :(得分:0)

@Roberto为我指明了正确的方向:

df2 = df.groupby([col2])[col3].sum().reset_index().rename(columns = {col3:'extra_col'})
df = pd.merge(df, df2, on = [col2], how = 'left')
df[col4] = df[extra_col] - df[col3]