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

如何基于子串匹配跨DataFrame求和后为当前DataFrame新增列

报错原因

pd.Series.str.contains() 方法仅支持传入单个字符串/正则表达式作为匹配规则,你直接传入了整个lister[0]这个Series对象,而Pandas内部需要对匹配模式做哈希处理,可变的Series无法被哈希,因此抛出TypeError。

实现方案

方案1:逐行匹配(逻辑直观,适合数千行规模场景)

直接基于你已验证的单值计算逻辑,用apply遍历lister的每一行关键词做计算,和你的原有逻辑完全一致:

import pandas as pd
import numpy as np

# 你的样例构造代码
listy = pd.DataFrame(
    ['auto', 'ford', 'chevy', 'auto worker', 'ford motors', 'chevy trucks'])
listy['count'] = [24,45,384,81,156,66] # 替换成你的实际count值,原随机生成代码可保留
lister = pd.DataFrame(['auto','ford','chevy'])

# 核心计算代码
lister['total'] = lister[0].apply(
    lambda keyword: listy[listy[0].str.contains(keyword)]['count'].sum()
)

运行后lister的total列结果和预期一致:auto对应105、ford对应201、chevy对应450。
如果需要忽略大小写匹配,在str.contains中添加case=False参数即可:str.contains(keyword, case=False)。

方案2:向量化计算(性能更高,适合万行以上大数据集)

如果你的数据量更大,可以用正则分组的方式减少循环次数,提升运行效率:

# 构造所有关键词的正则匹配模式
pattern = '|'.join(lister[0].tolist())
# 提取listy每行匹配到的关键词
listy['match_key'] = listy[0].str.extract(f'({pattern})', expand=False)
# 按关键词分组求和
count_sum = listy.groupby('match_key')['count'].sum()
# 把求和结果映射到lister
lister['total'] = lister[0].map(count_sum)

注意:该方案默认每行仅匹配第一个命中的关键词,如果单条字符串需要匹配多个关键词并重复计入多个关键词的总和,优先使用方案1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:21:02