如何在不迭代的情况下合并对每一列求和的行
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()
我有以下 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()