如何在两个独立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
相关产品推荐
相关产品推荐

