【问题标题】:cross check if two df have different values and print any if there交叉检查两个 df 是否具有不同的值并打印任何如果有
【发布时间】:2022-11-23 19:55:15
【问题描述】:

我有两个 df,如果两个 df 中的值不同,我想检查 id 如果需要打印它们。

例子:

df1 = |id |check_column1|
      |1|abc|
      |1|bcd|
      |2|xyz|
      |2|mno|
      |2|mmm|
df2 = 
      |id |check_column2|
      |1|bcd|
      |1|abc|
      |2|xyz|
      |2|mno|
      |2|kkk|

这里的输出应该只是 |2|mmm|kkk|但由于索引不同,我将整个表作为输出

这就是我所做的

output = pd.merge(df1,df2, on= ['id'], how='inner')

event4 = output[output.apply(lambda x: x['check_column1'] != x['check_column2'], axis=1)]

【问题讨论】:

    标签: python pandas dataframe lambda merge


    【解决方案1】:

    想法是在两列中按id 对值进行排序,并通过GroupBy.cumcount 与辅助计数器连接,然后可以过滤不匹配的行:

    df1 = df1.sort_values(['id','check_column1'])
    df2 = df2.sort_values(['id','check_column2'])
        
    df = pd.merge(df1,df2, left_on= ['id',df1.groupby('id').cumcount()], 
                           right_on= ['id',df2.groupby('id').cumcount()])
    
    output = df[df['check_column1'] != df['check_column2']]
    print (output)
       id  key_1 check_column1 check_column2
    2   2      0           mmm           kkk
    

    【讨论】:

    • 这没有用。因为我需要知道相同 id 的不同值,所以上面的代码抛出 nan。我需要输出为 id 和值,在 df1 中显示为 1 个值,在 df2 中显示为不同的值
    • @vidathri - 答案已编辑。
    【解决方案2】:
    mask = np.where((df1['id'] == df2['id']) & (df1['check_column1'] == df2['check_column2']), True, False)
    
    output = df2[mask]
    

    【讨论】:

      猜你喜欢
      • 2019-09-13
      • 1970-01-01
      • 2021-08-21
      • 2014-02-03
      • 2015-01-25
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多