【问题标题】:How to merge and get the count of non-matching entries efficiently?如何有效地合并和获取不匹配条目的计数?
【发布时间】:2021-03-01 00:34:41
【问题描述】:

我有两个如下图所示的数据框

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','29SB','25FG','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 万条)。

我希望我的输出如下所示

【问题讨论】:

    标签: python pandas dataframe pandas-groupby series


    【解决方案1】:

    一种选择是从source_df 中获取source_value 作为一个集合,然后过滤和计算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
    

    【讨论】:

      【解决方案2】:
      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
      

      【讨论】:

        【解决方案3】:

        使用 Left Merge with 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
        

        【讨论】:

          【解决方案4】:
          
          client_df.groupby('source_value')['source_value'].count().loc[pd.Index(client_df.source_value).difference(source_df.source_value)]
          
          
          
          
          

          【讨论】:

            猜你喜欢
            • 2021-09-23
            • 1970-01-01
            • 2019-03-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-10-24
            • 1970-01-01
            • 2012-05-23
            相关资源
            最近更新 更多