验证 Pandas 数据框中的行在列中的值之间是否相等

时间:2021-04-01 07:03:37

标签: python pandas dataframe validation

假设我有一个如下所示的 Pandas DataFrame:

   C30    C25    C20    C15    C10
1  AJA    EJE    IJI    OJO    UJU
2  AJA    EJE    IJI    OJO    UJU
3  AJA    EJE    IJI    OJO    UJU
4  ABA    EBE    IBI    OBO    UBU
5  ABA    EBE    IBI    OBO    UBU
6  ABA    EBE    IBI    OBO    UNU
7  BOB    BIB    BEB    BAB    BUB

我想验证在 C30 中具有相等值的所有行在 C25、C20、C15 和 C10 中也具有相等的值。

我有大约 60,000 行,列值有很多变化,如果 C30 列中的元素相等,那么对应的 C25 列元素也应该相等,依此类推。

例如,验证应该显示不匹配,因为第 6 行中的 C10 值不等于 4 & 5 行。执行此操作的最有效方法是什么?

2 个答案:

答案 0 :(得分:1)

您可以使用 DataFrameGroupBy.nunique 并比较 DataFrame.ne 不等于 1

m = df.groupby('C30').nunique().ne(1)
print (m)
       C25    C20    C15    C10
C30                            
ABA  False  False  False   True
AJA  False  False  False  False
BOB  False  False  False  False

然后如果需要值如果没有匹配使用np.where

i, c  = np.where(m)

L = list(zip(m.index[i], m.columns[c]))

if len(L) > 0:
    print ('mismatch')
    print (L)
mismatch
[('ABA', 'C10')]
    

答案 1 :(得分:1)

使用 DataFrame.duplicated 查找不唯一的行。

df['is_dup'] = df.duplicated(keep=False)

输出

   C30  C25  C20  C15  C10  is_dup
1  AJA  EJE  IJI  OJO  UJU    True
2  AJA  EJE  IJI  OJO  UJU    True
3  AJA  EJE  IJI  OJO  UJU    True
4  ABA  EBE  IBI  OBO  UBU    True
5  ABA  EBE  IBI  OBO  UBU    True
6  ABA  EBE  IBI  OBO  UNU   False
7  BOB  BIB  BEB  BAB  BUB   False
相关问题