如何在保留Pandas DataFrame全部行前提下修改重复行对应列值
是否可以通过numpy的where方法实现?
可以。你可以通过np.where结合分组生成的重复行布尔掩码完成所有赋值操作,但对于体量较大的DataFrame,直接使用Pandas原生的分组+布尔索引操作效率更高,也更易读。
最优高效实现方案
核心逻辑全程使用向量化操作,不需要循环,千万行级别的DataFrame也可以快速处理:
import pandas as pd import numpy as np # 构造示例数据,实际使用时替换为你自己的DataFrame即可 df = pd.DataFrame({ 'id': [1,2,3,4,5,6], 'duplicate_id': [np.nan]*6, 'Country': ['Norway','Norway','Norway','Iceland','Iceland','Iceland'], 'action_code': [1.1, 1.1, 1.2, 2.0, 2.0, 2.0], 'keep': ['y']*6 }) # 1. 生成重复行标记:按Country、action_code分组,非首次出现的行标记为True dup_mask = df.duplicated(subset=['Country', 'action_code'], keep='first') # 2. 给重复行的duplicate_id赋值为对应组首次出现的id,非重复行保持为空 # 如果需要空字符串而非NaN,把最后的np.nan替换为''即可 df['duplicate_id'] = df.groupby(['Country', 'action_code'])['id'].transform('first').where(dup_mask, np.nan) # 3. 批量修改重复行的action_code和keep字段 df.loc[dup_mask, ['action_code', 'keep']] = [12, 'n']
如果你偏好使用np.where实现,也可以把后两步替换为如下写法,效果完全一致:
group_first_id = df.groupby(['Country', 'action_code'])['id'].transform('first') df['duplicate_id'] = np.where(dup_mask, group_first_id, np.nan) df['action_code'] = np.where(dup_mask, 12, df['action_code']) df['keep'] = np.where(dup_mask, 'n', df['keep'])
两种实现性能差异很小,前者仅做一次掩码匹配就完成两列赋值,内存开销略低于多次调用np.where,更推荐大表使用。
内容的提问来源于stack exchange,提问作者Prakash_S
相关产品推荐
相关产品推荐

