问题描述
我有两个数据框,如下所示
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 万条)。
我希望我的输出如下所示
解决方法
一种选择是从 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)]