Python计算pandas DataFrame两列互相匹配值占比的实现方法
import pandas as pd df = pd.DataFrame({"true_key" :["Astral","Blob","Blob","Cat","Astral"], "true_key2": ["Japan","Astral","Blob","quics","Cat"]})
方法1:pandas内置isin()实现(最常用)
直接调用Series的isin()方法返回布尔序列,对布尔序列求均值即可得到占比:
# 计算true_key列的值存在于true_key2的百分比 rate_key_in_key2 = df['true_key'].isin(df['true_key2']).mean() * 100 # 计算true_key2列的值存在于true_key的百分比 rate_key2_in_key = df['true_key2'].isin(df['true_key']).mean() * 100
上述代码运行后,rate_key_in_key2结果为100.0,rate_key2_in_key结果为60.0,和示例预期一致。
方法2:numpy的in1d()实现
如果习惯用numpy操作,也可以用np.in1d()实现相同逻辑,性能和isin基本一致:
import numpy as np rate_key_in_key2 = np.in1d(df['true_key'], df['true_key2']).mean() * 100 rate_key2_in_key = np.in1d(df['true_key2'], df['true_key']).mean() * 100
方法3:手动统计实现(适合自定义逻辑扩展)
如果需要在判断存在性时加入自定义逻辑,可以手动把参考列转成集合后遍历统计:
def calc_overlap_rate(check_series, ref_series): # 把参考列转成集合,提升查找效率 ref_set = set(ref_series) match_count = sum(1 for val in check_series if val in ref_set) return match_count / len(check_series) * 100 rate_key_in_key2 = calc_overlap_rate(df['true_key'], df['true_key2']) rate_key2_in_key = calc_overlap_rate(df['true_key2'], df['true_key'])
补充:按唯一值计算重合度
如果需求是统计两列的唯一取值的重合占比,先对两个列去重再计算即可:
unique_key = df['true_key'].drop_duplicates() unique_key2 = df['true_key2'].drop_duplicates() # true_key的唯一值存在于true_key2唯一值的占比 rate_unique_key_in_key2 = unique_key.isin(unique_key2).mean() * 100 # true_key2的唯一值存在于true_key唯一值的占比 rate_unique_key2_in_key = unique_key2.isin(unique_key).mean() * 100
内容的提问来源于stack exchange,提问作者LearnerJS
相关产品推荐
相关产品推荐

