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

基于另一列子串匹配初始化Pandas DataFrame列的问题

解决DataFrame按关键词批量新增列的报错问题

问题场景

我的DataFrame包含一个存储纯文本的summary列,同时拥有一个字典KEYWORDS_DICT(键为待添加的新列名,值为对应列的关键词列表)。需求是为DataFrame添加这些新列:若某行summary包含对应列的任意关键词则赋值1,否则赋值-99。

尝试的代码如下:

# headers 是字符串列表,keywords 是列表的列表,每个列对应一个关键词列表
KEYWORDS_DICT = dict(zip(headers, keywords))

for column in KEYWORDS_DICT:
    df[column] = np.where(any(df['summary'].str.contains(keyword) for keyword in KEYWORDS_DICT[column]), 1, -99)

运行时报错:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

错误原因

Python内置的any()函数会尝试判断生成器中每个Series的整体布尔值,但Pandas Series是多元素结构,无法直接返回单一布尔结果(系统无法确定你要判断所有元素还是任意元素),因此触发歧义错误。

解决方法

方法一:使用Pandas的行级any()方法(推荐)

将Python内置any()替换为Pandas DataFrame的.any(axis=1)方法,先把每个关键词的匹配结果拼成临时DataFrame,再按行判断是否存在任意匹配:

import numpy as np
import pandas as pd

# 假设已存在 df、headers、keywords
KEYWORDS_DICT = dict(zip(headers, keywords))

for col_name, keywords_list in KEYWORDS_DICT.items():
    # 生成每个关键词的匹配Series,组合成DataFrame
    match_results = pd.DataFrame({kw: df['summary'].str.contains(kw, na=False) for kw in keywords_list})
    # 按行判断是否有任意匹配,转换为1或-99
    df[col_name] = np.where(match_results.any(axis=1), 1, -99)

注:na=False用于处理summary列的空值,避免匹配结果出现NaN,保证逻辑一致性。

方法二:正则表达式合并关键词

把每个列的关键词合并为一个用|分隔的正则表达式,一次str.contains即可完成任意关键词的匹配:

import numpy as np
import pandas as pd
import re

KEYWORDS_DICT = dict(zip(headers, keywords))

for col_name, keywords_list in KEYWORDS_DICT.items():
    # 合并关键词为正则模式,用re.escape转义特殊字符
    regex_pattern = '|'.join(re.escape(kw) for kw in keywords_list)
    # 匹配后转换为1或-99
    df[col_name] = np.where(df['summary'].str.contains(regex_pattern, na=False), 1, -99)

注:re.escape()用于处理关键词中的正则特殊字符(如.、*等),避免意外匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 05:13:21