该类由一组属性和函数组成,包括:
属性:
- df:一个
pandas数据框。 - numerical_feature_names:具有数值的 df 列。
- label_column_names:要分组的 df 字符串列。
函数:
mean(nums):接受一个数字列表作为输入并返回均值fill_na(df, numerical_feature_names, label_columns):接受类属性作为输入并返回一个转换后的 df。
这是类定义:
class PLUMBER(): def __init__(self): ################# attributes ################ self.df=df # 指定标签和数值特征名称: self.numerical_feature_names=numerical_feature_names self.label_column_names=label_column_names ##################### mean ############################## def mean(self, nums): total=0.0 for num in nums: total=total+num return total/len(nums) ############ fill the numerical features ################## def fill_na(self, df, numerical_feature_names, label_column_names): # 声明参数: df=self.df numerical_feature_names=self.numerical_feature_names label_column_names=self.label_column_names # 现在用分组均值替换 NaN for numerical_feature_name in numerical_feature_names: df[numerical_feature_name]=df.groupby([label_column_names]).transform(lambda x: x.fillna(self.mean(x))) return df
在尝试将其应用于 pandas 数据框时:
if __name__=="__main__": # 初始化类 plumber=PLUMBER() # 用分组均值替换 NaN df=plumber.fill_na(df=df, numerical_feature_names=numerical_feature_names, label_column_names=label_column_names)
会出现以下错误:
ValueError: Grouper and axis must be same length
数据和类参数
如何修改类以获得转换后的 df(即用其分组均值替换 np.nan 的那个)?
回答:
首先,错误的原因是 label_column_names 已经是一个 list,所以在 groupby 中不需要用 [] 包围它。因此,应该使用 df.groupby(label_column_names)... 而不是 df.groupby([label_column_names])...
现在,为了真正解决您的问题,在类的 fill_na 函数中,用以下代码替换 for 循环(实际上您不需要这个循环):
df[numerical_feature_names] = ( df[numerical_feature_names] .fillna( df.groupby(label_column_names) [numerical_feature_names].transform('mean') ))
在这段代码中,您用 groupby.transform 的结果来填充 numerical_feature_names 列的 fillna,这些结果是这些列的均值。