如何基于子串匹配跨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
相关产品推荐
相关产品推荐

