检查行列之间的重复项

时间:2019-03-13 14:57:57

标签: python pandas numpy

我正在尝试遍历数据框,以检查特定行的列中是否有重复项,然后结果应返回整个行。我感兴趣的列从Prod_code_1升至Prod_code_47。我的问题的一部分是如何在比较该行的一列中的值与该行的相邻列相匹配时,如何设置列名的格式。

如果特定行的列内有重复项,则结果应返回整个行/ True。

我需要的列看起来像这样(数据框还有很多其他列,而不仅仅是下面显示的列):

Prod_code_1  | Prod_desc_1 | Prod_code_2 | Prod_desc_2 | 
DIS          | DIS         | DIS         | DIS         |  (returns true)
DIS          | DIS         | DIS         | UVA         |  (returns false)

我的代码:

for index, row in df.iterrows():
    for i in range(1,len(df)):
        if df['Prod_code_'+str(i)][row] == df['Prod_code_'+str(i+1)][row]:
             print(row)

我遇到的错误是:

  系列的真相是模棱两可的。使用a.empty,a.bool(),a.item(),a.any(),a.all()

我知道这应该是一个相对简单的操作,但是我很困惑,想知道是否有人知道我的查询的简单解决方案。将不胜感激任何帮助。谢谢 :)。

3 个答案:

答案 0 :(得分:0)

您可以使用is_unique属性来检查该行是否只有相同的值。

df.apply(lambda row: row.is_unique, axis=1)

另请参阅:
Series.nunique
Series.unique

答案 1 :(得分:0)

您的数据非常广泛:有一堆跟踪相似指标的字段。您可能会发现使用df.melt()融化df很有帮助。

假设您的数据框为df,并且您对字段list = ['prod_code_1', 'prod_code_2', ... , 'prod_code_47']

感兴趣
meltdf = df.melt(id_vars='some id', value_vars=list, var_name='prod_code')

现在,您所有的“ prod_code_#”字段都位于一列中。希望这可以帮助您朝正确的方向开始。

答案 2 :(得分:0)

我假设您的要求如下:

  • 您要从大数据框中过滤掉某些感兴趣的列
  • 然后您要检查所有列是否相等,然后应返回 True 布尔值

如果我的理解是正确的,请按照以下解决方法进行操作。

  1. 步骤1:

    • 要获取您的子集数据框,您的列名似乎遵循一个模式,我们可以在循环中使用它,并从中创建一个新的数据框(可以有更好的方法,但是我相信这应该工作正常)

      df_subset = pd.DataFrame() # Creating a new dataframe
      for cols in list(df.columns): # Assuming df is the original dataframe
         if 'Prod_' in cols:
            df_subset[cols] = df[cols]
      

      这应该返回您感兴趣的列的子集。

  2. 步骤2:

    • 我有类似的工作要求,但是我的数据框中有一些np.nan值,在执行检查时必须将其忽略但不能删除。如果您遇到这种情况,请以其他方式查看下面的代码,请跳至下一步:

         for cols in list(df_subset.columns):
             df_subset.loc[df_subset[cols].isnull(),cols] = df_subset['Prod_code_1']
      

      在这里,我只是用第一列的值替换任何行中任何列的null值(假设第一列将始终保留一个值)。

  3. 步骤3:

    • 检查一行的所有列值是否相等

         df_is_equal = df_subset.eq(df_subset.iloc[:,0],axis=0).all(1)
      

      在这里,我只是用第一列的值检查dataframe列的值。请遵循熊猫 eq 文档以了解更多信息。

这些步骤应该可以完成您在此处所做的尝试。