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

如何编写函数计算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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 22:47:46