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

Pandas:聚合为最长集合——提取DataFrame中非重叠唯一文件路径

提取DataFrame中无重叠的文件路径条目

问题描述

给定包含id和filepath的DataFrame,需要按id分组提取无重叠的文件路径——即排除那些是其他路径前缀的短路径,只保留最长的、不被其他路径包含的条目,最终将每个id对应的路径用逗号拼接。

输入的DataFrame如下:

import pandas as pd

df = pd.DataFrame({"id": [1, 1, 1, 1, 1, 1, 2, 2],
                   "filepath": ['src', 'src/abc', 'src/abc/cde',
                                'src/abc/cde/main', 'src/abc/cde/main/detach', 'dl/path',
                                'src', 'dl/path']})

期望输出:

id                          filepath
0   1  src/abc/cde/main/detach, dl/path
1   2                      src, dl/path

解决方法

核心思路是按id分组后,优先保留最长的路径,排除作为其他路径前缀的短路径。具体步骤如下:

  1. 定义路径处理函数:对单组路径去重、排序,筛选出无重叠的路径
  2. 分组应用函数:用groupby将函数应用到每个id组,拼接结果

代码实现

def get_unique_paths(paths):
    # 去重,避免重复处理相同路径
    unique_paths = list(set(paths))
    # 按路径深度(分割后的元素数量)降序排序,最长路径优先
    unique_paths.sort(key=lambda x: len(x.split('/')), reverse=True)
    result = []
    for path in unique_paths:
        # 检查当前路径是否是已有结果中路径的前缀(加/避免误判类似src和src1的情况)
        if not any(existing.startswith(f"{path}/") for existing in result):
            result.append(path)
    # 按字母排序,和示例输出对齐
    result.sort()
    return ', '.join(result)

# 分组处理并生成结果
expected = df.groupby('id')['filepath'].apply(get_unique_paths).reset_index()

逻辑说明

  • 去重:先剔除组内重复的路径,减少计算量
  • 降序排序:最长路径先被处理,确保后续短路径如果是它的前缀会被排除
  • 前缀检查:通过startswith(f"{path}/")判断当前路径是否是其他路径的父路径,若不是则保留
  • 拼接结果:将筛选后的路径排序后用逗号拼接,得到目标格式

内容的提问来源于stack exchange,提问作者John Stud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:53:26