列在熊猫中没有下降

时间:2019-02-25 09:39:45

标签: python pandas dataframe

我有两个职能。

第一个显示数据框中每列空值的百分比:

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 :(得分:0)

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)

这也应该起作用。

答案 1 :(得分:0)

我认为问题出在self.df = self.df.drop(self.columns[k], axis=1, inplace=True)行。由于放置到位,执行self.df.drop(self.columns[k], axis=1, inplace=True)就足够了。就地执行操作时,放置操作的返回值为None(请参见documentation)。