如何在不迭代的情况下合并对每一列求和的行

how to merge rows summing over each column without iteration

我有以下 df:

   prevent     _p     _n  _id
0        1      0      0  83135
0        0      1      0  83135
0        0      1      0  82238

我想合并具有相同列的所有行_id通过对每一列求和来合并 数据框中所需的输出,final(请注意,如果总和大于 1,则该值应仅为 1):

     prevent     _p     _n  _id
0          1      1      0  83135
0          0      1      0  82238

我可以使用以下代码遍历数据框轻松地做到这一点:

final = pd.DataFrame()
for id_ in _ids:
        
        out = df[df._id == id_]
        
        prevent = 0
        _p = 0
        _n = 0

        d = {}

        if len(out) > 0:

            for row in out.itertuples():
                if prevent == 0:
                    prevent += row.prevent
                if _p == 0:
                   _p += row._p
                if _n == 0:
                   _n += row._n
               
            d['_p'] = _p
            d['_n'] = _n
            d['prevent'] = prevent
           
            t=pd.DataFrame([d])
            t['_id'] = id_
            final=pd.concat([final, t])

我有几十万行,这样效率会很低。有没有办法对其进行矢量化?

勾选groupby

out = df.groupby('_id',as_index=False).sum()

使用 any 将 0 和 1 视为布尔值,然后将它们转换回整数:

df.groupby("_id").any().astype("int").reset_index()