我正在开发一个临床生物信息学应用程序这个应用程序得到的输入是一个看起来像这样的数据框架
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']}