首页 > 解决方案 > 检查行列之间的重复项

问题描述

我正在尝试遍历数据框以检查特定行的列中是否有任何重复项,然后结果应返回整行。我感兴趣的列从 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()

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

标签: pythonpandasnumpy

解决方案


我假设您的要求如下:

  • 您想从大数据框中过滤掉一些感兴趣的列
  • 然后你想检查所有列是否相等,那么应该返回一个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)
      

      在这里,我只是用第一列的值检查数据框列的值。请关注 pandas eq文档以了解更多信息。

这些步骤应该做你在那里尝试的。


推荐阅读