如何用Python Pandas为文件路径列生成父路径列?
解决方案
方法一:用os.path.dirname(最简洁高效)
Python内置的os.path模块专门处理路径,dirname方法可以直接提取父路径,只需处理根路径的特殊情况:
import os import pandas as pd df = pd.DataFrame(["/home", "/home/folder1", "/home/folder1/file1.xlsx", "/home/folder1/file1.xlsx", "/home/folder1/file2.xlsx", "/home/folder2", "/home/folder2/date", "/home/folder2/date/dates.txt", "/home/folder3"], columns=["file_path"]) # 提取父路径 df['parent_path'] = df['file_path'].apply(os.path.dirname) # 将根路径的父路径(/)替换为ROOT df['parent_path'] = df['parent_path'].replace('/', 'ROOT') print(df)
运行后直接得到预期结果,这种方法依赖Python成熟的路径处理逻辑,避免自己造轮子出错。
方法二:完成你自己的match_parent函数
按照你提出的「层级匹配+前序完全匹配」思路,完善函数如下:
import pandas as pd df = pd.DataFrame(["/home", "/home/folder1", "/home/folder1/file1.xlsx", "/home/folder1/file1.xlsx", "/home/folder1/file2.xlsx", "/home/folder2", "/home/folder2/date", "/home/folder2/date/dates.txt", "/home/folder3"], columns=["file_path"]) # 转成集合提升查询效率 file_paths_set = set(df['file_path'].unique()) def match_parent(x): path_parts = x.split('/') # 计算路径层级:分割后的列表长度减1(比如/home分割后是['', 'home'],层级为1) current_level = len(path_parts) - 1 # 层级为1时,没有父路径,返回ROOT if current_level == 1: return "ROOT" # 拼接父路径:取前current_level个部分(对应层级减1的路径) parent_path = '/'.join(path_parts[:current_level]) # 可选:验证父路径是否存在于已知路径中(如果需要严格校验) if parent_path in file_paths_set: return parent_path # 若父路径不在数据中,可返回默认值或按需求处理 return parent_path df['parent_path'] = df['file_path'].apply(match_parent) print(df)
核心逻辑:
- 把路径按
/拆分成片段,通过片段数量判断层级 - 父路径是当前路径去掉最后一个片段后的拼接结果
- 特殊处理层级为1的路径(直接返回ROOT)
- 可选集合校验确保父路径确实存在于DataFrame中
方法三:字符串切片手动处理
如果不想用os模块,直接通过字符串操作截取父路径:
import pandas as pd df = pd.DataFrame(["/home", "/home/folder1", "/home/folder1/file1.xlsx", "/home/folder1/file1.xlsx", "/home/folder1/file2.xlsx", "/home/folder2", "/home/folder2/date", "/home/folder2/date/dates.txt", "/home/folder3"], columns=["file_path"]) def get_parent_path(x): # 找到最后一个/的位置 last_slash_pos = x.rfind('/') # 根级路径(比如/home)的最后一个/在索引0,返回ROOT if last_slash_pos == 0: return "ROOT" # 截取最后一个/之前的内容作为父路径 return x[:last_slash_pos] df['parent_path'] = df['file_path'].apply(get_parent_path) print(df)
这种方法逻辑直观,适合快速实现简单的路径处理需求。
内容的提问来源于stack exchange,提问作者matt.aurelio
相关产品推荐
相关产品推荐

