Python中如何从pandas DataFrame中批量移除指定URL
pandas 移除DataFrame内逗号分隔单元格中指定URL的方案
你贴的示例代码有三个明显问题:列名拼写不一致(代码里写的url2和实际列名urls2不符)、直接拿整列值做整串替换匹配不到逗号分隔的单个URL、没处理URL前后的空格导致匹配漏判。
核心思路
- 先把所有要移除的URL整理成集合结构,成员判断效率远高于列表,适合大体量数据
- 逐列逐单元格处理:把逗号分隔的URL字符串拆成单个URL,逐个清理首尾空格后过滤掉命中移除名单的项,剩下的内容再用逗号拼接回字符串
- 空值单独判断跳过,避免转字符串的时候出问题
可直接复用的代码
import pandas as pd # 测试数据 df = pd.DataFrame({ 'urls':['https://pippo.it, https://pluto.it', 'http://blah.com'], 'urls2':['http://blah.net', 'https://pippo.it, https://pluto.it'] }) # -------------------------- # 配置要移除的URL,两种方式选一种即可 # 方式1:手动指定要移除的URL集合 blocked_urls = {'https://pippo.it', 'https://pluto.it'} # 方式2:从DataFrame的指定存储黑名单的列(示例用urls2列)自动提取所有待移除URL,自动拆分逗号分隔的多值 # blocked_urls = set() # # 先跳过空值避免报错 # for cell in df['urls2'].dropna(): # for url in str(cell).split(','): # cleaned_url = url.strip() # if cleaned_url: # blocked_urls.add(cleaned_url) # 遍历所有列做过滤,如果只需要处理部分列,把df.columns改成对应列名的列表即可 for col in df.columns: df[col] = df[col].apply( lambda x: ', '.join([ url.strip() for url in str(x).split(',') if url.strip() not in blocked_urls ]) if pd.notna(x) else x ) print(df)
运行效果
用方式1(手动指定移除https://pippo.it、https://pluto.it)的话,最终输出的DataFrame如下:
| urls | urls2 |
|---|---|
| (空字符串) | http://blah.net |
| http://blah.com | (空字符串) |
小提示:如果不需要过滤存储待移除URL的列本身,遍历列的时候把这个列排除即可。
内容的提问来源于stack exchange,提问作者perfectson
相关产品推荐
相关产品推荐

