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分组后,优先保留最长的路径,排除作为其他路径前缀的短路径。具体步骤如下:
- 定义路径处理函数:对单组路径去重、排序,筛选出无重叠的路径
- 分组应用函数:用
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
相关产品推荐
相关产品推荐

