按Pandas中file唯一值分组生成path列表并应用公共前缀函数
没问题,这就帮你搞定这个需求,直接上完整的解决方案和解释:
完整代码示例
import pandas as pd from itertools import takewhile # 定义你提供的自定义函数 def allnamesequal(name): return all(n == name[0] for n in name[1:]) def commonprefix(paths, sep=';'): bydirectorylevels = zip(*[p.split(sep) for p in paths]) return sep.join(x[0] for x in takewhile(allnamesequal, bydirectorylevels)) # 创建示例DataFrame df = pd.DataFrame( [ ["fileA", "Users;user;Downloads;folder1"], ["fileA", "Users;user;Downloads;folder2"], ["fileA", "Users;user;Downloads;folder1"], ["fileB", "Users;user;Documents;folder1"], ["fileB", "Users;user;Documents;folder1"], ["fileB", "Users;user;Downloads;folder1"] ], columns=['file', 'path'] ) # 分组处理:生成path列表并计算共同前缀 result = df.groupby('file')['path'].agg( path_list=list, common_prefix=lambda x: commonprefix(x.tolist()) ).reset_index() # 打印结果 print(result)
运行结果
file path_list common_prefix 0 fileA [Users;user;Downloads;folder1, Users;user;Down... Users;user;Downloads 1 fileB [Users;user;Documents;folder1, Users;user;Doc... Users;user
代码解释
- 导入依赖与定义函数:先导入
pandas和itertools.takewhile,再定义你提供的两个自定义函数,用于计算路径的共同前缀。 - 创建DataFrame:还原你给出的示例数据结构。
- 分组处理:
- 用
groupby('file')按文件名分组,聚焦path列的数据。 - 通过
agg()方法一次性完成两个需求:path_list=list:将每个分组下的所有path值转换为字符串列表,完全匹配你要的每个file对应path列表的要求。common_prefix=lambda x: commonprefix(x.tolist()):把分组后的path序列转为列表,传入自定义的commonprefix函数,计算出该组路径的共同前缀。
- 最后用
reset_index()把分组的file列从索引转为普通列,让结果格式更友好。
- 用
简化版(若只需要共同前缀)
如果不需要保留每个file对应的path列表,只需要共同前缀,可以简化代码:
common_prefix_result = df.groupby('file')['path'].apply(lambda x: commonprefix(x.tolist())).reset_index(name='common_prefix') print(common_prefix_result)
运行结果:
file common_prefix 0 fileA Users;user;Downloads 1 fileB Users;user
内容的提问来源于stack exchange,提问作者Saraha
相关产品推荐
相关产品推荐

