使用dplyr识别组内LEVEL1有但LEVEL0无对应TITLE的行
问题解决:识别分组内LEVEL=1时独有的TITLE行
原始数据
原始数据框df如下:
GROUP NAME TITLE LEVEL A John Lead 0 A John Staff 1 A Jake Jr 0 B Bob Lead 1 B Bob Lead 0 C Andrew Jr 0 C Andrew Jr 1 C Rebecca Staff 0
需求
找出每个GROUP中,同一NAME在LEVEL=1时拥有的TITLE,在LEVEL=0时不存在的行。
示例结果
符合条件的结果如下:
GROUP NAME TITLE LEVEL A John Staff 1
原因:A组的John在LEVEL=1时的TITLE是Staff,但LEVEL=0时没有这个TITLE。
解决方案(基于Pandas)
通过分组筛选、集合对比即可实现需求,具体步骤和代码如下:
import pandas as pd # 构造原始数据 data = { 'GROUP': ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C'], 'NAME': ['John', 'John', 'Jake', 'Bob', 'Bob', 'Andrew', 'Andrew', 'Rebecca'], 'TITLE': ['Lead', 'Staff', 'Jr', 'Lead', 'Lead', 'Jr', 'Jr', 'Staff'], 'LEVEL': [0, 1, 0, 1, 0, 0, 1, 0] } df = pd.DataFrame(data) # 提取LEVEL=0的所有TITLE,按GROUP和NAME分组存为集合 level0_title_sets = df[df['LEVEL'] == 0].groupby(['GROUP', 'NAME'])['TITLE'].apply(set).reset_index(name='LEVEL0_TITLES') # 提取LEVEL=1的行,和LEVEL0的TITLE集合做关联 level1_merged = df[df['LEVEL'] == 1].merge(level0_title_sets, on=['GROUP', 'NAME'], how='left') # 筛选出TITLE不在对应LEVEL0集合中的行 result = level1_merged[~level1_merged.apply(lambda row: row['TITLE'] in row['LEVEL0_TITLES'], axis=1)] # 保留原始列并输出 result = result[['GROUP', 'NAME', 'TITLE', 'LEVEL']] print(result)
运行代码后即可得到符合需求的结果。
内容的提问来源于stack exchange,提问作者user3249770
相关产品推荐
相关产品推荐

