检查数据帧的许多列是否完全相同



我正在开发一个临床生物信息学应用程序这个应用程序得到的输入是一个看起来像这样的数据框架

df = pd.DataFrame({'store': ['Blank_A09', 'Control_4p','13_MEG3','04_GRB10','02_PLAGL1','Control_21q','01_PLAGL1','11_KCNQ10T1','16_SNRPN','09_H19','Control_6p','06_MEST'],
'quarter': [1, 1, 2, 2, 1, 1, 2, 2,2,2,2,2],
'employee': ['Blank_A09', 'Control_4p','13_MEG3','04_GRB10','02_PLAGL1','Control_21q','01_PLAGL1','11_KCNQ10T1','16_SNRPN','09_H19','Control_6p','06_MEST'],
'foo': [1, 1, 2, 2, 1, 1, 9, 2,2,4,2,2], 
'columnX': ['Blank_A09', 'Control_4p','13_MEG3','04_GRB10','02_PLAGL1','Control_21q','01_PLAGL1','11_KCNQ10T1','16_SNRPN','09_H19','Control_6p','06_MEST']})
print(df)

store  quarter     employee  foo      columnX
0     Blank_A09        1    Blank_A09    1    Blank_A09
1    Control_4p        1   Control_4p    1   Control_4p
2       13_MEG3        2      13_MEG3    2      13_MEG3
3      04_GRB10        2     04_GRB10    2     04_GRB10
4     02_PLAGL1        1    02_PLAGL1    1    02_PLAGL1
5   Control_21q        1  Control_21q    1  Control_21q
6     01_PLAGL1        2    01_PLAGL1    9    01_PLAGL1
7   11_KCNQ10T1        2  11_KCNQ10T1    2  11_KCNQ10T1
8      16_SNRPN        2     16_SNRPN    2     16_SNRPN
9        09_H19        2       09_H19    4       09_H19
10   Control_6p        2   Control_6p    2   Control_6p
11      06_MEST        2      06_MEST    2      06_MEST

这是一个最小的可重复的例子,但真正的例子有不确定的列数,其中第一列,第三列,第五列,第七列,等等"应该"。完全一样

这就是我要检查的。我想确保这些列的值顺序相同。

我知道如何检查两列是否完全相同,但我不知道如何将此检查扩展到所有数据帧。

编辑:

列的名称改变了,在我的例子中,它们只是两个例子。

参考这里如何检查3列是否相同,并添加一个新的列,如果值是相同的?

下面的代码将检查是否有更多的列是相同的,并返回相同行的索引

arr = df[['quarter','foo_test','foo']].values #You can add as many columns as you wish
np.where((arr == arr[:, [0]]).all(axis=1))

您需要根据您的使用情况进行调整

编辑
columns_to_check = [x for x in range(1, len(df.columns), 2)]
arr = df.iloc[:, columns_to_check].values

如果您想要一个有效的方法,您可以使用pandas.util.hash_pandas_object对Series进行散列,使操作O(n):

pd.util.hash_pandas_object(df.T, index=False)

我们清楚地看到,store/employee/columnX有相同的哈希值:

store       18266754969677227875
quarter     11367719614658692759
employee    18266754969677227875
foo            92544834319824418
columnX     18266754969677227875
dtype: uint64

您可以进一步使用groupby来识别相同的值:

df.columns.groupby(pd.util.hash_pandas_object(df.T, index=False))

输出:

{   92544834319824418: ['foo'],
11367719614658692759: ['quarter'],
18266754969677227875: ['store', 'employee', 'columnX']}

最新更新