You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将DataFrame子集重复值替换为NaN但保留行的实现方法

解决DataFrame重复子集替换为NaN的问题

直接用pandas的mask结合duplicated方法就能实现需求,核心逻辑是针对不同列的重复判定范围(逐步扩大前置列的组合),将重复值替换为NaN,完整代码如下:

import pandas as pd

# 构建示例DataFrame
data = {
    'A': ['Mark', 'Mark', 'Mark', 'John', 'John', 'Karl', 'Karl', 'Karl'],
    'B': ['NY', 'NY', 'NY', 'NY', 'NY', 'LA', 'LA', 'LA'],
    'C': ['Confirmed', 'Confirmed', 'Confirmed', 'N/A', 'N/A', 'Confirmed', 'Confirmed', 'Confirmed'],
    'D': ['Buy', 'Buy', 'Buy', 'Sell', 'Buy', 'Buy', 'Buy', 'Buy'],
    'E': [10, 22, 40, 55, 30, 22, 66, 25]
}
df = pd.DataFrame(data)

# 按列依次处理重复值替换
df['A'] = df['A'].mask(df.duplicated(subset=['A']))
df['B'] = df['B'].mask(df.duplicated(subset=['A', 'B']))
df['C'] = df['C'].mask(df.duplicated(subset=['A', 'B', 'C']))
df['D'] = df['D'].mask(df.duplicated(subset=['A', 'B', 'C', 'D']))

# 输出结果
print(df)

执行后得到的结果:

A    B          C     D   E
0  Mark   NY  Confirmed   Buy  10
1   NaN  NaN        NaN   NaN  22
2   NaN  NaN        NaN   NaN  40
3  John   NY        N/A  Sell  55
4   NaN  NaN        NaN   Buy  30
5  Karl   LA  Confirmed   Buy  22
6   NaN  NaN        NaN   NaN  66
7   NaN  NaN        NaN   NaN  25

完全符合需求,既保留了所有行,又把重复的子集内容替换成了NaN。

内容的提问来源于stack exchange,提问作者giaggi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:45:37