【问题标题】:How to clean image urls in pandas dataframe?如何清理熊猫数据框中的图片网址?
【发布时间】:2018-12-17 03:52:12
【问题描述】:
我有一个数据框,其中我有一些图像 url 存储在一个列中。
我需要清理图像 url 以进行进一步处理,目前图像 url 采用这种格式-
df['image url'][1]
'https://www.example.com/newshop/images/backup/detailed/olivia.jpg#{[EN]:;}'
df['image url'][2]
'https://www.example.com/newshop/images/backup/detailed/Monkey_copy.jpg#{[EN]:Monkey;}'
清理图片网址的最佳方法应该是什么,以便我在我的 datfarme 中拥有正确的图片网址?
【问题讨论】:
标签:
python
string
python-3.x
pandas
url
【解决方案1】:
使用str.split 通过索引str[0] 选择第一个列表:
df['image url'] = df['image url'].str.split('#', 1).str[0]
如果性能很重要并且没有NaNs,则使用列表理解:
df['image url'] = [x.split('#', 1)[0] for x in df['image url']]
时间安排:
df = pd.DataFrame({'image url':['https://www.example.com/newshop/olivia.jpg#{[EN]:;}',
'https://www.example.com/newshop/Monkey_copy.jpg#{[EN]:Monkey;}']})
#[20000 rows x 2 columns]
df = pd.concat([df] * 10000, ignore_index=True)
df['image url'] = [x.split('#', 1)[0] for x in df['image url']]
df['image url1'] = df['image url'].str.split('#', 1).str[0]
print (df)
In [215]: %timeit df['image url'] = [x.split('#', 1)[0] for x in df['image url']]
8.1 ms ± 1.53 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [216]: %timeit df['image url1'] = df['image url'].str.split('#', 1).str[0]
21.4 ms ± 638 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
【解决方案2】:
根据您的示例,您可以使用 pd.Series.str.split 将字符串转换为 URL。这假设您在 URL 的任何重要部分都没有 #。
df = pd.DataFrame({'image url': ['https://www.example.com/newshop/images/backup/detailed/olivia.jpg#{[EN]:;}',
'https://www.example.com/newshop/images/backup/detailed/Monkey_copy.jpg#{[EN]:Monkey;}']})
df['image url'] = df['image url'].str.split('#', 1).str[0]
# alternative:
# df['image url'] = df['image url'].str.split('#', 1, expand=True).iloc[:, 0]
print(df['image url'].iloc[0])
https://www.example.com/newshop/images/backup/detailed/olivia.jpg