У меня есть столбец dataframe, который выглядит так:
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]
Я хочу извлечь versions
из столбца в таком формате:
Мой желаемый результат:
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}'....] v2
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) + ')')
Но результата не дает. Я просмотрел и другие коды, но ни один из них не дал мне желаемого результата. Я изо всех сил пытаюсь понять это, любая помощь будет оценена.
Это кажется хорошим кандидатом на регулярное выражение:
import pandas as pd
import re
data = [
[['/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']]
]
df = pd.DataFrame(data, columns=['paths'])
ver = re.compile(r'/(v\d(\.\d)?)/')
def getver(row):
vsets = set()
for p in row:
chk = ver.search(p)
vsets.add( chk.group(1) )
return '/'.join(vsets)
df['Version'] = df.paths.apply(getver)
print(df)
Выход:
paths Version
0 [/api/v2/clouds, /api/v2/clouds/{cloud}] v2
1 [/v0.1/book-lists/{type}/{date}, /v0.1/book-li... 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/d... v0.2/v0.3/v0.1
Не нужно использовать ключевые слова, просто используйте pandas.Series.str.findall, как вы начали:
df["Path_Version"]= (
df["paths"].str.findall(r"(v\d\.?\d?)")
.apply(lambda x: "/".join(set(x)))
)
print(df.to_string())
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.2/v0.3/v0.1