识别不同lid组间重复pi值并生成duplicates标记列
解决跨组重复PI值的标记问题
针对需求——标记跨不同lid组重复的pi值,且同一组内仅首次出现的该pi值标1,其他情况标0,这里给出直接可用的解决方案:
核心思路
- 先筛选出在多个lid组出现的pi值:通过分组统计每个pi对应的不同lid数量,保留数量大于1的pi集合。
- 结合两个条件生成标记列:
- 条件一:当前pi属于跨组重复的pi集合
- 条件二:当前行是该lid组内该pi的首次出现
- 把两个条件的结果做逻辑与运算,再转换为整数(True→1,False→0)。
完整代码
import pandas as pd # 示例DataFrame df = pd.DataFrame({'lid': [1, 1, 1, 2, 2, 2, 2, 3, 3, 4, 4], 'pi': ['A', 'B', 'C', 'A', 'D', 'E', 'F', 'D', 'H', 'I', 'J']}) # 生成duplicates标记列 df['duplicates'] = ( # 筛选跨组重复的pi df['pi'].isin(df.groupby('pi')['lid'].nunique()[lambda x: x > 1].index) # 标记组内首次出现的pi & ~df.duplicated(subset=['lid', 'pi']) ).astype(int) print(df)
运行结果
lid pi duplicates 0 1 A 1 1 1 B 0 2 1 C 0 3 2 A 1 4 2 D 1 5 2 E 0 6 2 F 0 7 3 D 1 8 3 H 0 9 4 I 0 10 4 J 0
关键代码解释
df.groupby('pi')['lid'].nunique():统计每个pi对应的不同lid数量,比如pi'A'对应2个不同lid,pi'B'对应1个。lambda x: x > 1:筛选出在多个lid组出现的pi,也就是需要标记的pi集合。~df.duplicated(subset=['lid', 'pi']):duplicated()默认标记重复行(除第一行),加~取反后,得到每个(lid, pi)组合的首次出现行。- 两个条件用
&结合,同时满足则为True,转换为整数后就是1,否则为0。
特殊情况验证
如果同一lid组内有重复的pi且该pi跨组重复,比如修改示例为:
df = pd.DataFrame({'lid': [1,1,2,2], 'pi': ['A','A','A','B']})
运行代码后结果符合需求:
lid pi duplicates 0 1 A 1 1 1 A 0 2 2 A 1 3 2 B 0
内容的提问来源于stack exchange,提问作者Dima
相关产品推荐
相关产品推荐

