该类由一组属性和函数组成,包括:
属性:
- 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
,这些结果是这些列的均值。