Pandas:根据较长字符串列表中的匹配项扩展列字符串值
Pandas: Expand column string values based on matches in a list of longer strings
有人能想出一个巧妙的方法 pandas 来根据包含 URL 的列表将包含图像文件名的列扩展为包含完整 URL 的列吗?
我有以下数据框
df1:
"src" "obs1" "obs2"
myimg_1 val_11 va1_12
myimg_2 val_11 val_22
以及以下列表
列表 1:
https://path/to/myimg1
https://path/to/myimg2
.
.
https://path/to/myimgN
我需要的是以下数据框:
df2:
"src" "obs1" "obs2"
https://path/to/myimg1 val_11 val12
https://path/to/myimg2 val_21 val22
df1['src'] 的相同图像文件名可能存在于列表 1 中的多个 URL 中,但我们假设情况并非如此。否则我只需要一个 URL 而不是 list1.
中所有可能的匹配项
非常感谢任何提示!
从您的列表中创建一个数据框,并使用 urlparse
和 os.path.basename
提取 url 的最后一部分。最后,使用 merge
将列 url
添加到原始数据框。
>>> df
src obs1 obs2
0 myimg1 val_11 va1_12
1 myimg2 val_11 val_22
>>> urls
['https://path/to/myimg1', 'https://path/to/myimg2', 'https://path/to/myimgN']
# from urllib.parse import urlparse
# import os.path
df1 = pd.DataFrame(urls, columns=['url'])
# df1['src'] = df1['url'].apply(lambda x: os.path.basename(urlparse(x).path))
df1['src'] = df1['url'].str.split('/').str[-1]
df = df.merge(df1, on='src')
>>> df
src obs1 obs2 url
0 myimg1 val_11 va1_12 https://path/to/myimg1
1 myimg2 val_11 val_22 https://path/to/myimg2
注意:我稍微修改了您的数据框,因为 myimg_1
与您的列表不匹配。打字错误?
有人能想出一个巧妙的方法 pandas 来根据包含 URL 的列表将包含图像文件名的列扩展为包含完整 URL 的列吗?
我有以下数据框
df1:
"src" "obs1" "obs2"
myimg_1 val_11 va1_12
myimg_2 val_11 val_22
以及以下列表
列表 1:
https://path/to/myimg1
https://path/to/myimg2
.
.
https://path/to/myimgN
我需要的是以下数据框:
df2:
"src" "obs1" "obs2"
https://path/to/myimg1 val_11 val12
https://path/to/myimg2 val_21 val22
df1['src'] 的相同图像文件名可能存在于列表 1 中的多个 URL 中,但我们假设情况并非如此。否则我只需要一个 URL 而不是 list1.
中所有可能的匹配项非常感谢任何提示!
从您的列表中创建一个数据框,并使用 urlparse
和 os.path.basename
提取 url 的最后一部分。最后,使用 merge
将列 url
添加到原始数据框。
>>> df
src obs1 obs2
0 myimg1 val_11 va1_12
1 myimg2 val_11 val_22
>>> urls
['https://path/to/myimg1', 'https://path/to/myimg2', 'https://path/to/myimgN']
# from urllib.parse import urlparse
# import os.path
df1 = pd.DataFrame(urls, columns=['url'])
# df1['src'] = df1['url'].apply(lambda x: os.path.basename(urlparse(x).path))
df1['src'] = df1['url'].str.split('/').str[-1]
df = df.merge(df1, on='src')
>>> df
src obs1 obs2 url
0 myimg1 val_11 va1_12 https://path/to/myimg1
1 myimg2 val_11 val_22 https://path/to/myimg2
注意:我稍微修改了您的数据框,因为 myimg_1
与您的列表不匹配。打字错误?