使用Lambda函数计算两个Pandas DataFrame差异并添加剧集差值列
高效实现变更条目高亮与差值计算
当然可以!你完全不需要用慢到离谱的for循环来做这个——利用pandas的向量操作和链式调用,就能在同一行(链式代码)里完成筛选变更条目+新增差值列的需求,效率直接拉满。
优化后的代码
import pandas as pd import numpy as np new = {'name': ['Sheldon', 'Penny', 'Amy', 'Bernadette', 'Raj', 'Howard'], 'episodes': [42, 24, 31, 29, 37, 40], 'gender': ['male', 'female', 'female', 'female', 'male', 'male']} old = {'name': ['Sheldon', 'Penny', 'Amy', 'Bernadette', 'Raj', 'Howard'], 'episodes': [12, 32, 31, 32, 37, 40], 'gender': ['male', 'female', 'female', 'female', 'male', 'male']} df1 = pd.DataFrame(new, columns=['name','episodes', 'gender']) df = pd.DataFrame(old, columns=['name','episodes', 'gender']) # 链式实现:重命名列→合并→新增差值列→筛选变更条目 a = (df .rename(columns={'episodes': 'episodes_old'}) # 给旧表的剧集数重命名 .merge(df1.rename(columns={'episodes': 'episodes_new'}), # 给新表的剧集数重命名 on='name', how='left', indicator=True) .assign(episode_diff=lambda x: x['episodes_new'] - x['episodes_old']) # 计算差值 .loc[lambda x: x['_merge'] == 'left_only']) # 筛选出变更的条目
代码解释
- 重命名列:把两个表的
episodes分别改成episodes_old和episodes_new,避免合并后列名冲突,同时能清晰区分新旧值; - 合并表:基于
name字段左连接,保留旧表的所有条目,_merge字段用来标记匹配情况; - 新增差值列:用
assign+lambda直接计算新旧剧集数的差值(你可以根据需求改成episodes_old - episodes_new); - 筛选变更条目:最后筛选出
_merge为left_only的行,也就是旧表有但和新表不匹配的变更条目。
为什么比for循环快?
这个方法用的是pandas的向量式操作,底层基于numpy实现,会一次性处理整列数据,而不是逐行循环。对于大数据集来说,效率能提升几十甚至上百倍。
输出示例
运行后a的结果会是这样:
| name | episodes_old | gender | episodes_new | _merge | episode_diff |
|---|---|---|---|---|---|
| Sheldon | 12 | male | 42 | left_only | 30 |
| Penny | 32 | female | 24 | left_only | -8 |
| Bernadette | 32 | female | 29 | left_only | -3 |
内容的提问来源于stack exchange,提问作者Slartibartfast




