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

如何基于层级化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)

运行之后,得到的结果就是你要的最终表格:

IDQuestion Code
1Q01-1
1Q02
2Q01
2Q02-1-1
2Q02-2

逻辑解释

这个函数的核心逻辑很简单:

  • 对每个ID的分组,遍历每一个问题代码
  • 检查这个代码是否是某个子问题的父级(通过判断是否有其他问题代码以当前代码+'-'开头)
  • 如果没有任何子问题存在,就保留这个代码;反之则删掉父问题,只留最底层的子问题

不管你的问题层级有多深(比如Q02-1-1这种三级子问题),这个逻辑都能准确识别,自动保留最细分的那一行,完全满足你的需求~

备注:内容来源于stack exchange,提问作者rayyar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:17:57