让我们假设数据框为
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
行,所以要花很多时间!
有没有更好/更快的方法?
提前谢谢
答案 0 :(得分:2)
将此groupby
与transform
结合使用,以实现单线无合并:
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]