如何有效地合并和获取不匹配条目的数量?

问题描述

我有两个数据框,如下所示

import pandas as pd
import numpy as np
source_df = pd.DataFrame({'source_value':['21ABCDE1','22CDEF2','23DEF3','24FGH4']})
client_df = pd.DataFrame({'source_value':['21ABCDE1','29SB','21ABCDE1','25FG','31DE','35DE']})

我想要做的是找到 source_values 中存在但 client_df 中不存在的 source_df数量

请注意,client_df 中可以有重复项,但 source_df 中不能

基本上我必须识别它们,因为它们无效(因为它们在 source_df 的父数据框中丢失)

我尝试了以下,但它用于匹配条目。

pd.merge(
    source_df,client_df,how="inner",on = 'source_value').groupby('source_value').size()

如何优雅地处理 non-matching 条目,因为我有数百万条数据(至少 1000 万条记录,最多可达 1500 万条)。

我希望我的输出如下所示

enter image description here

解决方法

一种选择是从 source_value 中获取 source_df 作为一个集合,然后过滤和计算 client_df 中的值:

source_values = set(source_df.source_value.to_list())
client_df.source_value[lambda x: ~x.isin(source_values)].value_counts()

#29SB    2
#25FG    2
#35DE    1
#31DE    1
#Name: source_value,dtype: int64
,
In []: client_df[~client_df.source_value.isin(source_df.source_value)].value_counts()
Out[]:
       source_value
       29SB            2
       25FG            2
       35DE            1
       31DE            1
       dtype: int64
,

使用 Left Merge 和 Indicator 仅识别客户端中的那些

In[]: merge_df = client_df.merge(source_df,how='left',indicator=True)
      merge_df[merge_df['_merge']=='left_only'].groupby('source_value').size()

Out[]:
    source_value
    25FG    2
    29SB    2
    31DE    1
    35DE    1
,

client_df.groupby('source_value')['source_value'].count().loc[pd.Index(client_df.source_value).difference(source_df.source_value)]