假设我有一个如下所示的 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 行。执行此操作的最有效方法是什么?
答案 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