使用Pandas的.str.contains检查列表值时遇ValueError问题求助
问题:匹配DataFrame列值并修改对应Category列
场景与原数据
需要检查DataFrame的Description列是否匹配字符串列表中的任意元素,匹配则将对应行的Category列改为Misc。
原DataFrame:
Date Description Category Amount 5 2020-05-23 CAPITAL ONE ONLINE PYMT Payment/Credit -200.00 4 2020-05-25 Amazon.com Merchandise 73.78 3 2020-05-26 AMZN Mktp US Merchandise 14.88 1 2020-05-27 DOMINO'S PIZZA Dining 17.42 2 2020-05-27 SALEM REC CTR Health Care 20.89 0 2020-05-28 JAPANESE RESTAURANT Dining 31.69
原错误代码
# Define the Description reference list for the Misc Category misc_ref_list = ['Amazon', 'AMZN'] if in_df['Description'].str.contains("|".join(misc_ref_list)) == True: in_df['Category'] = 'Misc'
报错信息
if in_df['Description'].str.contains("|".join(misc_ref_list), flags=re.IGNORECASE, regex=True) == True: File "C:\Program Files\Python37\lib\site-packages\pandas\core\generic.py", line 1538, in __nonzero__ f"The truth value of a {type(self).__name__} is ambiguous. " ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
错误原因
in_df['Description'].str.contains(...)返回的是一个布尔Series(每一行对应一个True/False),直接把整个Series放在if条件里时,pandas无法判断你是要检查「是否存在至少一个匹配项」还是「所有行都匹配」,因此抛出歧义错误。
正确解决方法
方法1:布尔索引+loc定位修改
直接用str.contains返回的布尔掩码,定位到匹配的行并修改对应列:
import pandas as pd # 定义匹配列表 misc_ref_list = ['Amazon', 'AMZN'] # 生成匹配掩码 mask = in_df['Description'].str.contains("|".join(misc_ref_list)) # 仅修改匹配行的Category列 in_df.loc[mask, 'Category'] = 'Misc'
执行后,原DataFrame中Amazon.com和AMZN Mktp US对应的Category会被改为Misc,其他行不受影响。
方法2:忽略大小写匹配(可选)
如果需要忽略大小写差异(比如匹配amazon、Amazon、AMAZON等),可以添加flags=re.IGNORECASE参数(需导入re模块):
import re mask = in_df['Description'].str.contains("|".join(misc_ref_list), flags=re.IGNORECASE) in_df.loc[mask, 'Category'] = 'Misc'
内容的提问来源于stack exchange,提问作者Geep636
相关产品推荐
相关产品推荐

