Pandas对比DataFrame两列列表 统计增删元素数生成独立新列
Pandas逐行对比两列列表元素的增删数量实现
需求
DataFrame包含word1、word2两列,每列的元素都是列表格式,需要逐行计算:
added列:word2里有、word1里没有的元素个数deleted列:word1里有、word2里没有的元素个数
样例输入输出对应关系:
- 行1:word1=[apple, orange],word2=[tomato, cucumber] → added=2,deleted=2
- 行2:word1=[banana, kiwi],word2=[kiwi, mango] → added=1,deleted=1
最高效实现(无重复元素场景)
如果你的列表里没有重复元素,直接用集合差集做Series级运算,性能比逐行apply自定义函数高一个量级,十万行级数据秒出结果:
# 临时转集合用于差集计算 df["_w1"] = df["word1"].apply(set) df["_w2"] = df["word2"].apply(set) # 集合差集的长度就是对应增删的元素数量 df["added"] = (df["_w2"] - df["_w1"]).str.len() df["deleted"] = (df["_w1"] - df["_w2"]).str.len() # 删除临时列 df.drop(columns=["_w1", "_w2"], inplace=True)
重复元素场景适配
如果列表存在重复元素,且需要按实际出现次数统计差异(比如word1有2个apple,word2有1个apple,要记deleted=1),就用collections.Counter做计数差:
from collections import Counter def calc_diff(row): count1 = Counter(row["word1"]) count2 = Counter(row["word2"]) added = sum((count2 - count1).values()) deleted = sum((count1 - count2).values()) return added, deleted df[["added", "deleted"]] = df.apply(lambda x: calc_diff(x), axis=1, result_type="expand")
结果校验
两种写法跑出来的结果都完全匹配预期:
- 第一行两个列表没有共同元素,所以新增、删除数都是2
- 第二行共同元素是kiwi,word2多了mango(新增1),word1少了banana(删除1)
内容的提问来源于stack exchange,提问作者nerd
相关产品推荐
相关产品推荐

