Pandas:使用集合条件替换DataFrame时触发TypeError报错求助
解决Pandas中替换非常见邮箱域名的错误问题
你的问题出在直接将Series对象和集合用not in比较——Pandas的Series是向量型结构,不能像单个字符串那样用普通的in/not in操作符,得用Pandas提供的向量化方法isin()来处理。
错误原因解析
df.email_domain是一个Series,当你写df.email_domain not in common_addresses时,Python会尝试判断整个Series是否是集合的成员,这显然不符合你的需求(你需要逐个判断每个元素是否在集合里),所以触发了TypeError。
正确实现代码
import pandas as pd # 定义常见邮箱域名集合 common_addresses = set(["yahoo.com", "gmail.com", "hotmail.com"]) # 构造示例DataFrame df = pd.DataFrame({ "id": [1, 2, 3, 4], "email_domain": ["yahoo.com", "gmail.com", "unk.com", "new.com"] }) # 生成正确的布尔掩码:筛选不在集合中的域名 mask = ~df["email_domain"].isin(common_addresses) # 替换为"rare" df.loc[mask, "email_domain"] = "rare" # 查看结果 print(df)
代码说明
df["email_domain"].isin(common_addresses):返回一个布尔Series,每个元素对应原Series中该值是否在集合里(True表示在,False表示不在)~:对布尔Series取反,这样mask就表示不在常见集合中的域名- 之后用
df.loc[mask, "email_domain"] = "rare"完成替换,这是Pandas中修改指定行数据的标准写法
运行后你会得到预期的结果:
id email_domain 0 1 yahoo.com 1 2 gmail.com 2 3 rare 3 4 rare
内容的提问来源于stack exchange,提问作者anon_swe
相关产品推荐
相关产品推荐

