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

如何在两个独立DataFrame中实现自定义字符串包含等对比分析

DataFrame 对比分析解决方案

问题背景

现有两个以Key为唯一标识的DataFrame A和B:

DataFrame A

Key | Col1 | Col2 
 A     aa     bb 
 B     bb     bc
 C     cc     bd

DataFrame B

Key | Col1 | Col2 
 A     a       b     
 B     ab      c  
 C     cc      b  

需完成4项对比分析:

  • 统计A中每列非空单元格数量
  • 统计每列中A与B值相等的记录数占A中非空单元格数的比例
  • 统计每列中B的字符串包含于A对应字符串的记录数(预期结果:Col1为2,Col2为3)
  • 自定义对比(如字符串相似度度量)

已实现前两项代码:

counts = A.notna().sum()
scores = B.eq(A).sum().div(counts)

需简洁实现第3、4项,避免合并DataFrame的繁琐操作。


解决方案

前提准备

先将Key设为索引,确保A和B的行严格对齐:

A = A.set_index('Key')
B = B.set_index('Key')

第3项:统计B字符串包含于A的记录数

利用apply逐列处理,结合字符串包含判断,同时过滤A的空值:

# 统计符合条件的记录数
contains_counts = (
    A.apply(lambda col: 
        # 仅处理A中非空的行,检查B对应值是否包含在A的字符串中
        col.notna() & col.str.contains(B[col.name], na=False)
    )
    .sum()
)

执行后结果与预期一致:

Col1    2
Col2    3
dtype: int64

第4项:自定义对比(以字符串相似度为例)

以编辑距离(Levenshtein相似度)为例,先安装依赖python-Levenshtein,再通过apply实现逐元素计算:

from Levenshtein import ratio

# 计算每列的平均相似度(仅考虑A非空的行)
avg_similarity = (
    A.apply(lambda col: 
        # 过滤A非空的行,计算对应位置A与B字符串的相似度
        col[col.notna()].apply(lambda a, b: ratio(a, b), args=(B[col.name][col.notna()],))
    )
    .mean()
)

若需其他自定义逻辑,只需替换ratio(a, b)为你的自定义函数即可(比如判断字符串长度差、首字符匹配等),代码结构保持一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 03:50:20