将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
相关产品推荐
相关产品推荐

