Эффективный способ проверить, что датафрейм имеет полную сетку данных - PullRequest
0 голосов
/ 22 февраля 2019

Я хочу проверить, все ли данные в пределах кадра данных от верхнего левого угла кадра данных до самого нижнего правого элемента завершены (данные должны быть заполнены в виде прямоугольника).Если у него есть пустые столбцы или строки после основной части данных, это нормально (и оно будет иметь это).

Ниже приведены примеры хороших и плохих фреймов данных:

bad_dataframe = pd.DataFrame([[1,1,1,""],["","","",""],[1,"",1,""],["","","",""]])
good_dataframe = pd.DataFrame([[1,1,1,""],[1,1,1,""],[1,1,1,""],[1,1,1,""],["","","",""]])

СпособЯ сделал это следующим образом

def not_rectangle_data(DataFrame):
    """
    This function will check if the data given to it is a "rectangle"
    """

    #removes all rows and columns that contain only blanks
    reduced_dataframe = DataFrame[DataFrame != ""].dropna(how="all",axis = 1).dropna(how="all",axis = 0)

    #removes all rows and columns that contain any blanks
    super_reduced_dataframe = reduced_dataframe.dropna(how="any",axis = 1).dropna(how="any",axis = 0)

    #Check that dataframe is not empty and that no column or no rows are half empty
    if not reduced_dataframe.empty and \
            super_reduced_dataframe.equals(reduced_dataframe):        

        #Check that columns in remain data are still present
        if ((max(reduced_dataframe.index) + 1) == reduced_dataframe.shape[0]) and \
            ((max(reduced_dataframe.columns) + 1) == reduced_dataframe.shape[1]):
            return True
        else:
            return False
    else:
        return False

Однако я чувствую, что должен быть более краткий способ сделать это.

Большое спасибо

1 Ответ

0 голосов
/ 22 февраля 2019

Использование numpy:

import numpy as np

def check_rectangle(df):
    non_zeros = np.nonzero(df.values)
    arr = np.zeros(np.max(non_zeros, 1)+1)
    np.add.at(arr, non_zeros, 1)
    return np.alltrue(arr)

check_rectangle(good_dataframe)
# True
check_rectangle(bad_dataframe)
# False
  • np.nonzero захватывает все индексы, которые не равны нулю ('' здесь считается нулем).
  • np.zeros(np.max(non_zeros, 1)+1) создаетнаименьший прямоугольник, который соответствует non_zeros.
  • np.add.at добавлен 1 ко всем ненулевым местам.
  • Наконец, np.alltrue возвращает True, если прямоугольник заполнен,остальное False.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...