基于多列名称统计文本列中名称出现次数的Python问题
解决方法
核心思路
对每行数据,提取name1、name2、name3中的非空名称,逐个统计每个名称在对应text里的精确单词出现次数(避免子串误统计,比如barbieken不会被算作barbie),最后求和得到目标列count_name。
代码实现
import pandas as pd import re # 还原你的示例DataFrame data = { 'text': [ 'barbie and ken live in a house', 'bond is preparing a bond movie', 'homer likes donuts', 'where does mary live', 'i am travelling with john', 'barbie ken barbieken' ], 'name1': ['barbie', 'bond', 'homer', 'peter', 'john', 'barbie'], 'name2': ['ken', 'james', 'bart', pd.NA, pd.NA, 'ken'], 'name3': ['sophie', pd.NA, pd.NA, pd.NA, pd.NA, pd.NA] } df = pd.DataFrame(data) # 定义每行的统计逻辑 def count_matching_names(row): # 过滤出当前行的非空名称 valid_names = [name for name in [row['name1'], row['name2'], row['name3']] if pd.notna(name)] total_count = 0 current_text = row['text'] for name in valid_names: # 用正则匹配完整单词,避免子串干扰 # re.escape处理名称中的特殊字符,防止正则语法错误 matches = re.findall(r'\b' + re.escape(name) + r'\b', current_text) total_count += len(matches) return total_count # 按行应用函数生成结果列 df['count_name'] = df.apply(count_matching_names, axis=1) print(df)
代码说明
- 正则匹配逻辑:用
\b标记单词边界,确保只有完整的目标名称会被统计,比如barbieken里的barbie不会被误算。 - 缺失值处理:通过
pd.notna过滤掉name列中的空值,避免无效统计。 - 按行处理:
df.apply(..., axis=1)实现逐行计算,保证每行的统计结果对应自身的text和name数据。
运行结果
输出的DataFrame与你期望的count_name完全一致:
text name1 name2 name3 count_name 0 barbie and ken live in a house barbie ken sophie 2 1 bond is preparing a bond movie bond james <NA> 2 2 homer likes donuts homer bart <NA> 1 3 where does mary live peter <NA> <NA> 0 4 i am travelling with john john <NA> <NA> 1 5 barbie ken barbieken barbie ken <NA> 2
内容的提问来源于stack exchange,提问作者MG Fern
相关产品推荐
相关产品推荐

