You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何替换Pandas列中存在于指定列表的字符串?以域名后缀移除为例

问题解决与原代码失效原因

原代码为什么无效?

  • 你使用的df['firm'].str.lower().replace(web_domains, '')里的replace是Pandas Series的普通替换方法,而非字符串专属的str.replace。这个方法默认是匹配整个单元格字符串进行替换,只有当单元格内容完全等于.com或.us时才会生效,显然你的数据里不存在这种情况,因此没有任何替换效果。
  • 即便换成str.replace,直接传入列表的方式也不被支持,Pandas的str.replace需要结合正则表达式才能实现批量子串替换。

正确解决方案

方法1:正则匹配末尾域名后缀

将目标域名后缀转换为正则模式,精准匹配字符串末尾的后缀并替换为空,同时支持忽略大小写:

import pandas as pd
import re

df = pd.DataFrame(['amazon.us', 'pepsi', 'YOUTUBE.COM', 'apple.inc'], columns=['firm'])
web_domains = ['.com', '.us']

# 构建正则:转义后缀中的点号,匹配字符串末尾的任意目标后缀
pattern = '(' + '|'.join(re.escape(domain) for domain in web_domains) + ')$'
df['clean_firm'] = df['firm'].str.replace(pattern, '', flags=re.IGNORECASE)
print(df)

输出结果:

firm clean_firm
0    amazon.us      amazon
1        pepsi       pepsi
2  YOUTUBE.COM      YOUTUBE
3    apple.inc    apple.inc

方法2:自定义函数处理(保留原大小写)

如果需要保留原字符串的大小写格式,可以用自定义函数判断并切割:

import pandas as pd

df = pd.DataFrame(['amazon.us', 'pepsi', 'YOUTUBE.COM', 'apple.inc'], columns=['firm'])
web_domains = ['.com', '.us']

def remove_domain(s):
    s_lower = s.lower()
    if '.' in s_lower:
        name_part, suffix = s_lower.rsplit('.', 1)
        if '.' + suffix in web_domains:
            return s.rsplit('.', 1)[0]
    return s

df['clean_firm'] = df['firm'].apply(remove_domain)

补充说明

  • 正则方法更简洁高效,适合大规模数据批量处理;自定义函数则更灵活,能应对复杂的后缀判断逻辑。
  • 域名后缀中的.是正则特殊字符,必须用re.escape()转义,否则会匹配任意字符导致错误替换。

内容的提问来源于stack exchange,提问作者Serge Kashlik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 15:57:20