如何在Pandas DataFrame中按ID分组并按条件识别重复行
按组标记满足条件的Pandas重复行
需求说明
按ID分组,识别以下行并添加标记列Dup_with_condition_in_its_group_ID:
- 组内
Dest重复(同一ID下该Dest出现多次) - 该
Dest对应的组内存在Change="No"的行 - 标记规则:仅当该行
Change="Yes"时标记为Yes,其余情况均为No
可复现数据
import pandas as pd data = { "ID": ["RL1", "RL1", "RL1", "RL1", "RL2"], "Dest": ["Z32", "Z32", "Z33", "Z33", "Z32"], "Change": ["Yes", "No", "Yes", "Yes", "Yes"] } df = pd.DataFrame(data)
解决方案代码
# 计算标记列 df['Dup_with_condition_in_its_group_ID'] = ( # 1. 检查当前(ID, Dest)组内是否存在Change="No" df.groupby(['ID', 'Dest'])['Change'].transform(lambda x: (x == 'No').any()) & # 2. 检查当前(ID, Dest)组内是否有重复(行数>1) df.groupby(['ID', 'Dest'])['Dest'].transform('size') > 1 & # 3. 当前行Change为"Yes" (df['Change'] == 'Yes') ).map({True: 'Yes', False: 'No'}) # 输出结果 print(df)
代码解释
- 组内存在
No的判断:按ID+Dest组合分组,用transform将组内是否存在Change="No"的结果广播到每一行,得到布尔值。 - 重复行判断:同样按
ID+Dest分组,用transform('size')获取组内行数,判断是否大于1(即该Dest在当前ID组内重复)。 - 当前行条件判断:直接判断当前行的
Change是否为Yes。 - 组合条件并转换格式:三个条件同时满足时标记为
Yes,否则No,用map将布尔值转为指定字符串格式。
输出结果
| ID | Dest | Change | Dup_with_condition_in_its_group_ID |
|---|---|---|---|
| RL1 | Z32 | Yes | Yes |
| RL1 | Z32 | No | No |
| RL1 | Z33 | Yes | No |
| RL1 | Z33 | Yes | No |
| RL2 | Z32 | Yes | No |
内容的提问来源于stack exchange,提问作者DANIEL GARCIA DE CACERES HERRA
相关产品推荐
相关产品推荐

