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

识别不同lid组间重复pi值并生成duplicates标记列

解决跨组重复PI值的标记问题

针对需求——标记跨不同lid组重复的pi值,且同一组内仅首次出现的该pi值标1,其他情况标0,这里给出直接可用的解决方案:

核心思路

  1. 先筛选出在多个lid组出现的pi值:通过分组统计每个pi对应的不同lid数量,保留数量大于1的pi集合。
  2. 结合两个条件生成标记列:
    • 条件一:当前pi属于跨组重复的pi集合
    • 条件二:当前行是该lid组内该pi的首次出现
  3. 把两个条件的结果做逻辑与运算,再转换为整数(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:10:29