我有两个职能。
第一个显示数据框中每列空值的百分比:
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()
时,它将正确显示该列,接受用户输入,并且不会产生任何错误。但是,当我稍后在程序中显示数据框时,应该删除的列仍然存在。
答案 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)。