Все строки в данном столбце должны совпадать, для всех столбцов

У меня есть Pandas DataFrame данных, в которых все строки в данном столбце должны совпадать:

df = pd.DataFrame({'A': [1,1,1,1,1,1,1,1,1,1], 'B': [2,2,2,2,2,2,2,2,2,2], 'C': [3,3,3,3,3,3,3,3,3,3], 'D': [4,4,4,4,4,4,4,4,4,4], 'E': [5,5,5,5,5,5,5,5,5,5]}) In [10]: df Out[10]: ABCDE 0 1 2 3 4 5 1 1 2 3 4 5 2 1 2 3 4 5 ... 6 1 2 3 4 5 7 1 2 3 4 5 8 1 2 3 4 5 9 1 2 3 4 5 

Я хотел бы быстро узнать, есть ли какая-либо дисперсия в DataFrame. На этом этапе мне не нужно знать, какие значения менялись, так как я буду заниматься этим позже. Мне просто нужен быстрый способ узнать, нуждается ли DataFrame в дальнейшем внимании, или я могу игнорировать его и перейти к следующему.

Я могу проверить любой столбец, используя

 (df.loc[:,'A'] != df.loc[0,'A']).any() 

но мое знание Pandas ограничивает меня повторением через колонны (я понимаю, что итерация в Канданах неодобрительно), чтобы сравнить их все:

  ABCDE 0 1 2 3 4 5 1 1 2 9 4 5 2 1 2 3 4 5 ... 6 1 2 3 4 5 7 1 2 3 4 5 8 1 2 3 4 5 9 1 2 3 4 5 for col in df.columns: if (df.loc[:,col] != df.loc[0,col]).any(): print("Found a fail in col %s" % col) break Out: Found a fail in col C 

Есть ли элегантный способ вернуть логическое значение, если любая строка в любом столбце фреймворка не соответствует всем значениям в столбце … возможно без итерации?

Учитывая ваш примерный фреймворк:

 df = pd.DataFrame({'A': [1,1,1,1,1,1,1,1,1,1], 'B': [2,2,2,2,2,2,2,2,2,2], 'C': [3,3,3,3,3,3,3,3,3,3], 'D': [4,4,4,4,4,4,4,4,4,4], 'E': [5,5,5,5,5,5,5,5,5,5]}) 

Вы можете использовать следующее:

 df.apply(pd.Series.nunique) > 1 

Что дает вам:

 A False B False C False D False E False dtype: bool 

Если мы затем запустим пару ошибок:

 df.loc[3, 'C'] = 0 df.loc[5, 'B'] = 20 

Затем вы получаете:

 A False B True C True D False E False dtype: bool 

Вы можете сравнить весь DataFrame с первой строкой следующим образом:

 In [11]: df.eq(df.iloc[0], axis='columns') Out[11]: ABCDE 0 True True True True True 1 True True True True True 2 True True True True True 3 True True True True True 4 True True True True True 5 True True True True True 6 True True True True True 7 True True True True True 8 True True True True True 9 True True True True True 

затем проверьте, соответствуют ли все значения:

 In [13]: df.eq(df.iloc[0], axis='columns').all() Out[13]: A True B True C True D True E True dtype: bool In [14]: df.eq(df.iloc[0], axis='columns').all().all() Out[14]: True 

Вы можете использовать apply для циклического прохождения столбцов и проверить, одинаковы ли все элементы в столбце:

 df.apply(lambda col: (col != col[0]).any()) # A False # B False # C False # D False # E False # dtype: bool