You need to enable JavaScript to run this app. 如何在保留Pandas DataFrame全部行前提下修改重复行对应列值
优惠活动
大模型
产品
解决方案
定价
更多

如何在保留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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 02:06:11