如何从Pandas的paths列中提取路径版本信息?
提取Pandas DataFrame路径中的版本号
问题背景
现有一个包含路径数据的Pandas DataFrame,paths列数据示例如下:
paths 0 ['/api/v2/clouds', '/api/v2/clouds/{cloud}'] 1 ['/v0.1/book-lists/{type}/{date}', '/v0.1/book-lists'] 2 ['/v1/Video/Rooms', '/v1/Video/Rooms/{RoomSid}'] 3 ['/v3/attachments/{attachmentId}', '/v3/attachments'] 4 ['/v0.1/patrons', '/v0.2/patrons', '/v0.3/patrons/dependents']
需要提取路径中的版本号,生成Path_Version列,预期输出:
paths Path_Version 0 ['/api/v2/clouds', '/api/v2/clouds/{cloud}'] v2 1 ['/v0.1/book-lists/{type}/{date}', '/v0.1/book-lists'] v0.1 2 ['/v1/Video/Rooms', '/v1/Video/Rooms/{RoomSid}'] v1 3 ['/v3/attachments/{attachmentId}', '/v3/attachments'] v3 4 ['/v0.1/patrons', '/v0.2/patrons', '/v0.3/patrons/dependents'] v0.1/v0.2/v0.3
原尝试代码(未得到预期结果)
keywords = ['v1', 'v2', 'v3', 'v4', 'v1.0', 'v1.2', 'v1.1', 'v0.1', 'v0.2','v1.3', 'v1.4', 'v3.1', 'v3.2', '0.1.0', '3.1', 'v0.0.2', 'v0.0.3', 'v0.0.4', '1.0.0'] final_api['Path_Version'] = final_api['paths'].str.findall('(' + '|'.join(keywords) + ')')
问题原因
paths列是列表类型,直接用str.findall会把整个列表转为字符串处理,匹配逻辑错误;- 固定的keywords列表无法覆盖所有可能的版本号格式,扩展性差。
解决方案
使用正则表达式匹配版本号格式,结合apply遍历每个路径列表,提取去重后拼接:
import re import pandas as pd # 构造示例DataFrame(实际使用时替换为你的数据) data = { 'paths': [ ['/api/v2/clouds', '/api/v2/clouds/{cloud}'], ['/v0.1/book-lists/{type}/{date}', '/v0.1/book-lists'], ['/v1/Video/Rooms', '/v1/Video/Rooms/{RoomSid}'], ['/v3/attachments/{attachmentId}', '/v3/attachments'], ['/v0.1/patrons', '/v0.2/patrons', '/v0.3/patrons/dependents'] ] } final_api = pd.DataFrame(data) # 正则表达式:匹配以v开头,后跟数字(支持多段小数点分隔,如v0.1、v1.2.3) version_regex = re.compile(r'v\d+(?:\.\d+)*') def get_unique_versions(path_list): # 收集所有匹配到的版本号,用集合去重 versions = set() for path in path_list: matches = version_regex.findall(path) versions.update(matches) # 排序后用/连接,保证输出顺序一致 return '/'.join(sorted(versions)) # 生成Path_Version列 final_api['Path_Version'] = final_api['paths'].apply(get_unique_versions) print(final_api)
输出结果
paths Path_Version 0 ['/api/v2/clouds', '/api/v2/clouds/{cloud}'] v2 1 ['/v0.1/book-lists/{type}/{date}', '/v0.1/book... v0.1 2 ['/v1/Video/Rooms', '/v1/Video/Rooms/{Room... v1 3 ['/v3/attachments/{attachmentId}', '/v3/attach... v3 4 ['/v0.1/patrons', '/v0.2/patrons', '/v0.3/patr... v0.1/v0.2/v0.3
内容的提问来源于stack exchange,提问作者Brie MerryWeather
相关产品推荐
相关产品推荐

