【问题标题】:Compare multiple columns and count total unmatched比较多列并计算不匹配的总数
【发布时间】:2022-11-04 15:37:40
【问题描述】:

嗨,我正在比较一个具有多个配对列的数据集,我想计算有多少对不匹配。数据可能如下所示:

df=pd.DataFrame({'ID':['a','b','c'],
                 'A_1':[3,4,5],
                 'B_1':[1,5,7],
                 'A_2':[3,3,5],
                 'B_2':[3,3,7]})

我想要的是:

df1=pd.DataFrame({'ID':['a','b','c'],
                 'A_1':[3,4,5],
                 'B_1':[1,5,7],
                 'A_2':[3,3,5],
                 'B_2':[3,3,7],
                 'Count':[1,2,0]})

对于每个 ID,我将 A_1 与 A_2、B_1 与 B_2 进行比较,并计算不匹配结果的总数。在我的真实数据集中,我有 15 对,我当然不想手动比较。

alist=[A_1,A_2,B_1,B_2]

def match_count(df):
    Non_match_item_count=0
    for i in range(0,len(alist),2):
        if round(df[i],1)!=round(df[i+1],1):
            Non_match_item_count+=1
    return Non_match_item_count

df['Count']=df.apply(match_count,axis=1)

它不工作...

【问题讨论】:

    标签: pandas


    【解决方案1】:

    可能有一个花哨的 pandas 函数可以满足您的需求,但这是我将使用的方法。 给定df:

        ID  A_1 B_1 A_2 B_2
    0   a   3   1   3   3
    1   b   4   5   3   3
    2   c   5   7   5   7  
    

    我会利用 Collections.Counter 来计算每行中项目的出现次数,并确定只有 1 个条目的数字,如下所示: 从集合导入计数器

    def compute_mismatches(df):
        rslt = []
        for r in range(df.shape[0]):
            rc = Counter(df.iloc[r].to_list()[1:])
            k = 0
            for ky, val in rc.items():
                if val == 1:
                    k +=1
            rslt.append(k)
        return rslt   
    

    然后使用这个函数:

    df['Counts'] = compute_mismatches(df)  
    

    产量:

        ID  A_1 B_1 A_2 B_2 Counts
    0   a   3   1   3   3   0
    1   b   4   5   3   3   3
    2   c   5   7   5   7   1
    

    【讨论】:

    • 如果其中一个回复对您有用,请将其标记为答案(帖子左侧的复选标记)。发帖人因其选择的答案而获得声誉积分。
    【解决方案2】:

    我相信这应该有效:

    df['Count'] = (df.set_index('ID')
    .groupby(lambda x: x[0],axis=1)
    .diff()
    .abs()
    .gt(0)
    .sum(axis=1)
    .reset_index(drop=True))
    

    【讨论】:

      【解决方案3】:

      IIUC,您可以提取字母,对其进行分组并计算非唯一值的出现次数:

      cols = df.drop(columns='ID').columns
        
      df['Count'] = (df[cols] 
                    .groupby(cols.str.extract('(^[^_]+)', expand=False), axis=1)
                    .nunique(1).ne(1).sum(1)
                    )
      

      输出:

        ID  A_1  B_1  A_2  B_2  Count
      0  a    3    1    3    3      1
      1  b    4    5    3    3      2
      2  c    5    7    5    7      0
      

      【讨论】:

        【解决方案4】:
        df1.assign(col1=df1.iloc[:,1:].sort_index(axis=1).iloc[:,::2].rename(columns=lambda x:x[0])
            .ne(df1.iloc[:,1:].sort_index(axis=1).iloc[:,1::2].rename(columns=lambda x:x[0]))
            .sum(axis=1))
        
        
         ID  A_1  B_1  A_2  B_2  col1
        0  a    3    1    3    3     1
        1  b    4    5    3    3     2
        2  c    5    7    5    7     0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-02-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多