如何基于层级化Question Code对Pandas数据集按ID分组删除指定行?
如何基于层级化Question Code对Pandas数据集按ID分组删除指定行?
嗨,这个需求我完全get到了——每个ID下,只要某个问题存在更细分的子问题(比如Q01存在Q01-1),就删掉父问题,只保留最底层的子问题;如果一个问题没有任何子问题,就原样保留。我来给你一步步实现这个逻辑,完全匹配你要的结果。
首先,先把你的原始数据集用Pandas构造出来:
import pandas as pd # 构造原始数据 df = pd.DataFrame({ 'ID': [1,1,1,2,2,2,2,2], 'Question Code': ['Q01', 'Q01-1', 'Q02', 'Q01', 'Q02', 'Q02-1', 'Q02-1-1', 'Q02-2'] })
接下来写一个自定义的过滤函数,对每个ID分组处理:
def filter_hierarchical_questions(group): # 提取当前ID下的所有问题代码 all_q_codes = group['Question Code'].tolist() # 用来存储需要保留的问题代码 keep_codes = [] for q_code in all_q_codes: # 判断当前问题是否有子问题:检查是否存在其他问题代码以当前代码+"-"开头 has_sub_question = any(other_q.startswith(f"{q_code}-") for other_q in all_q_codes) # 如果没有子问题,就保留这个问题 if not has_sub_question: keep_codes.append(q_code) # 返回只保留目标代码的分组数据 return group[group['Question Code'].isin(keep_codes)] # 按ID分组应用过滤函数,然后重置索引让结果更整洁 result_df = df.groupby('ID', group_keys=False).apply(filter_hierarchical_questions).reset_index(drop=True)
运行之后,得到的结果就是你要的最终表格:
| ID | Question Code |
|---|---|
| 1 | Q01-1 |
| 1 | Q02 |
| 2 | Q01 |
| 2 | Q02-1-1 |
| 2 | Q02-2 |
逻辑解释
这个函数的核心逻辑很简单:
- 对每个ID的分组,遍历每一个问题代码
- 检查这个代码是否是某个子问题的父级(通过判断是否有其他问题代码以
当前代码+'-'开头) - 如果没有任何子问题存在,就保留这个代码;反之则删掉父问题,只留最底层的子问题
不管你的问题层级有多深(比如Q02-1-1这种三级子问题),这个逻辑都能准确识别,自动保留最细分的那一行,完全满足你的需求~
备注:内容来源于stack exchange,提问作者rayyar
相关产品推荐
相关产品推荐

