如何编写函数计算DataFrame两列共现词指标并存储为新DataFrame?
解决40万行数据集的问题文本相似度指标计算
我明白你的问题啦——原来的循环能打印出三个指标,但封装成函数后只能返回单个值,还想把这些结果存到新DataFrame里对吧?针对40万行的数据集,既要实现功能,还要考虑运行效率,我给你两种可行方案:
方案一:用自定义函数+apply(易读性高)
先写一个能同时返回三个指标的函数,再通过apply逐行处理数据集,自动生成对应列:
import pandas as pd def calculate_word_metrics(row): # 处理空值/NaN的情况,避免报错 q1 = row['question1'] if pd.notna(row['question1']) else '' q2 = row['question2'] if pd.notna(row['question2']) else '' # 转成小写、去首尾空格、拆分后转集合 set1 = set(q1.lower().strip().split()) set2 = set(q2.lower().strip().split()) # 计算核心指标 word_common = len(set1 & set2) word_total = len(set1) + len(set2) # 避免除以0的极端情况(比如两个问题都是空文本) word_share = round(word_common / word_total, 2) if word_total != 0 else 0.0 # 返回Series,自动对应后续的列名 return pd.Series( [word_common, word_total, word_share], index=['word_common', 'word_total', 'word_share'] ) # 假设你的原始数据集是df metrics_df = df.apply(calculate_word_metrics, axis=1) # 把指标列合并到原始DataFrame,或者单独保存metrics_df df = pd.concat([df, metrics_df], axis=1)
方案二:列表推导式(更高效,适合40万行大数据)
apply本质是逐行循环,对于超大数据集,用Python原生的列表推导式速度会更快:
import pandas as pd def process_text(text): """预处理文本:处理空值、转小写、去空格、转集合""" if pd.isna(text): text = '' return set(text.lower().strip().split()) # 先批量预处理所有问题文本,转成集合 q1_sets = [process_text(q) for q in df['question1']] q2_sets = [process_text(q) for q in df['question2']] # 批量计算三个指标 word_common = [len(s1 & s2) for s1, s2 in zip(q1_sets, q2_sets)] word_total = [len(s1) + len(s2) for s1, s2 in zip(q1_sets, q2_sets)] word_share = [round(c/t, 2) if t != 0 else 0.0 for c, t in zip(word_common, word_total)] # 生成指标DataFrame metrics_df = pd.DataFrame({ 'word_common': word_common, 'word_total': word_total, 'word_share': word_share }) # 合并到原始数据集 df = pd.concat([df, metrics_df], axis=1)
关键说明
- 为什么之前的函数只能返回单个值?因为如果函数只
return一个变量,apply只会生成一列;返回Series或元组的话,apply会自动把每个元素拆分成单独的列。 - 加入了空值和除以0的处理,避免大数据集中出现异常报错。
- 40万行的话更推荐方案二,列表推导式的运行速度比
apply快2-3倍左右。
内容的提问来源于stack exchange,提问作者aloneonthe_edge
相关产品推荐
相关产品推荐

