代码之家  ›  专栏  ›  技术社区  ›  Liu Yu

熊猫比较多列的值

  •  2
  • Liu Yu  · 技术社区  · 11 月前

    我想从下面的数据帧中逐列比较,找出列mark1、mark2、mark3、mark4和mark5中的任何值是否相同,并将结果列为True或False

    import pandas as pd
    
    df = pd.DataFrame(data=[[7, 2, 3, 7, 7], [3, 4, 3, 2, 7], [1, 6, 5, 2, 7], [5, 5, 6, 3, 1]],
                      columns=["mark1", "mark2", 'mark3', 'mark4', 'mark5'])
    

    理想输出:

       mark1  mark2  mark3  mark4  mark5          result
    0      7      2      3      7      7            True
    1      3      4      3      2      7            True
    2      1      6      5      2      7           False
    3      5      5      6      3      1            True
    

    所以我想出了一个函数,使用嵌套的forloop来比较列中的每个值,但不起作用。 AttributeError:“Series”对象没有属性“columns” 正确的方法是什么?无论如何都要避免嵌套的forloop。

    def compare_col(df):
        check = 0
        for i in range(len(df.columns.tolist())+1):
            for j in range(1, len(df.columns.tolist())+1):
                if df.iloc[i, i] == df.iloc[j, i]:
                    check += 1
        if check >= 1:
            return True
        else:
            return False
    
    df['result'] = df.apply(lambda x: compare_col(x[['mark1', 'mark2', 'mark3', 'mark4', 'mark5]]), axis=1)
    
    2 回复  |  直到 11 月前
        1
  •  2
  •   RomanPerekhrest    11 月前

    序列中唯一项的数量与其总大小之间的差异表明存在重复值。

    df['result'] = df.apply(lambda x: x.unique().size != x.size, axis=1)
    

       mark1  mark2  mark3  mark4  mark5  result
    0      7      2      3      7      7    True
    1      3      4      3      2      7    True
    2      1      6      5      2      7   False
    3      5      5      6      3      1    True
    
        2
  •  0
  •   Sharan Shetty    11 月前
    df['result'] = df.apply(lambda row: any(row[col] == row[col2] for col in range(len(df.columns)) for col2 in range(col+1, len(df.columns))), axis=1)
    

    我在这里遇到的问题是你根本做不到 row[col] == row[col+1] 因为这将只检查后续的值,所以需要2个循环来检查所有可能的值匹配。

        3
  •  0
  •   mozway    11 月前

    无需使用 apply 或循环,比较 nunique 到列数:

    df['result'] = df.nunique(axis=1).ne(df.shape[1])
    

    输出:

       mark1  mark2  mark3  mark4  mark5  result
    0      7      2      3      7      7    True
    1      3      4      3      2      7    True
    2      1      6      5      2      7   False
    3      5      5      6      3      1    True
    

    如果您想要一个更有效的方法,并假设列的数量合理(少于一千)和数字,您可以使用 sort 值,计算 diff 并检查是否有任何值 0 以下为:

    import numpy as np
    
    df['result'] = (np.diff(np.sort(df), axis=1)==0).any(axis=1)
    

    输出:

    mark1 mark2 mark3 mark4 mark5结果
    0 7 2 3 7 7正确
    1 3 4 3 2 7正确
    2 1 6 5 2 7错误
    3 5 5 6 3 1正确