Колонны не падают в пандах - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть две функции.

Первый отображает процент нулевых значений для каждого столбца в кадре данных:

def n_percent_nulls(self):
    global percent_null
    percent_null = self.isnull().sum() *100 / self.shape[0]
    return percent_null

Второй вычисляет, какие столбцы имеют более 40% нулевых значений, и запрашивает у пользователя одинна единицу, если она / он хочет отбросить столбцы:

def drop_n_percent_nulls(self):
    df_columns = list(self.columns)
    s = pd.Series(percent_null, index=[x for x in df_columns])
    for k, v in s.items():
        if v > (40):
            ask_user("\n{0} has over 40% null values, Would you like to drop it? (yes/no)\n".format(k))
            if ask_user in yes_values:
                self.df = self.df.drop(self.columns[k], axis=1, inplace=True)

Когда я вызываю функцию df.drop_n_percent_nulls() в функции main() программы, она правильно представит столбец, примет ввод пользователя,и не наложил ошибок.Однако, когда я представляю фрейм данных позже в программе, столбцы, которые должны были быть отброшены, все еще существуют.

Ответы [ 2 ]

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

Я считаю, что проблема в линии self.df = self.df.drop(self.columns[k], axis=1, inplace=True).Так как падение на месте, self.df.drop(self.columns[k], axis=1, inplace=True) должно быть достаточно.При выполнении на месте возвращаемое значение операции удаления равно None (см. документация ).

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

Вероятно, что if ask_user in yes_values: не оценивается как True, потому что если это так, self.df будет None (причина ниже).

В этом проблема, но как только вы правильно выполнили эту часть, вы обнаружите следующую проблему:


Вы должны удалить inplace=True в последнем ряду второй функции:

if ask_user in yes_values:
    self.df = self.df.drop(self.columns[k], axis=1)

, поскольку возвращаемое значение функций inplace=True в пандах равно None.

Или вы не можете присвоить выход функции обратно self.df:

if ask_user in yes_values:
    self.df.drop(self.columns[k], axis=1, inplace=True)

Это тоже должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...