You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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'])  # 筛选出变更的条目

代码解释

  1. 重命名列:把两个表的episodes分别改成episodes_oldepisodes_new,避免合并后列名冲突,同时能清晰区分新旧值;
  2. 合并表:基于name字段左连接,保留旧表的所有条目,_merge字段用来标记匹配情况;
  3. 新增差值列:用assign+lambda直接计算新旧剧集数的差值(你可以根据需求改成episodes_old - episodes_new);
  4. 筛选变更条目:最后筛选出_mergeleft_only的行,也就是旧表有但和新表不匹配的变更条目。

为什么比for循环快?

这个方法用的是pandas的向量式操作,底层基于numpy实现,会一次性处理整列数据,而不是逐行循环。对于大数据集来说,效率能提升几十甚至上百倍。

输出示例

运行后a的结果会是这样:

nameepisodes_oldgenderepisodes_new_mergeepisode_diff
Sheldon12male42left_only30
Penny32female24left_only-8
Bernadette32female29left_only-3

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

火山引擎 最新活动