【问题标题】:Getting the difference between two pandas dataframe using lamda使用 lambda 获取两个熊猫数据框之间的差异
【发布时间】:2021-09-18 21:22:14
【问题描述】:

我有以下代码:

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.merge(df1[['name','episodes']],on=['name','episodes'],how='left',indicator=True).loc[lambda x : x['_merge']=='left_only']

这很棒,因为它只突出显示已进行更改的条目。

有没有什么方法可以在同一行代码中添加不同情节的列?目前我正在使用.str.contains[] 进行for循环,但仍然非常慢。我正在寻找可以做到这一点的 lambda 函数。

【问题讨论】:

  • 如果你想发现差异,为什么要按episodes分组?
  • @Corralien - 加入两列以查找它们的不同之处。假设数据框对齐,df.assign(diff=df1.episodes - df.episodes).query('diff != 0') 的一种非常复杂的方法。
  • @MichaelSzczesny。我用您对 .query 的想法更新了我的答案,以避免创建一个 lambda 函数来评估 .loc。

标签: python python-3.x pandas lambda


【解决方案1】:

如果没有重复名称,您可以使用set_index:

>>> df1.assign(episodes_diff=df1.set_index('name')['episodes']
                                .sub(df.set_index('name')['episodes'])
                                .values) \
       .loc[lambda x : x['episodes_diff'].ne(0)]

         name  episodes  gender  episodes_diff
0     Sheldon        42    male             30
1       Penny        24  female             -8
3  Bernadette        29  female             -3

注意:您可以按照@MichaelSzczesny 的建议将.loc[...] 替换为.query('episodes_diff != 0'),这样更优雅、更清晰。

【讨论】:

    猜你喜欢
    • 2018-04-18
    • 2022-10-02
    • 1970-01-01
    • 2021-11-15
    • 2020-08-05
    • 2018-06-27
    • 2013-11-23
    • 2018-02-23
    相关资源
    最近更新 更多