如何将用众数填充空值的Lambda函数转换为常规函数?
Lambda函数转常规函数:用众数填充空值的正确实现
原Lambda函数的作用是遍历DataFrame的每一列,用该列的众数填充所有空值,最后返回处理后的完整DataFrame。你尝试的代码存在两个关键问题:
- 循环里一遇到有缺失值的列就直接
return,导致函数只返回第一个处理后的列,而非整个DataFrame - 没有对整个DataFrame进行修改并返回,逻辑不完整
下面是两种正确的转换方式:
方式一:定义单列处理函数,结合apply使用
这种方式和原Lambda逻辑最接近,只是把匿名的Lambda换成命名函数:
def fill_column_mode(column): # 对传入的单个列,用众数填充空值 return column.fillna(column.mode()[0]) def fill_nn(data): # 对DataFrame的每一列应用上面的处理函数 df = data.apply(fill_column_mode) return df
方式二:用循环遍历列,修改DataFrame副本
如果你想完全用循环实现,需要先创建DataFrame的副本,避免修改原数据,然后逐个处理每一列,最后返回完整的副本:
def fill_nn(df): # 创建原DataFrame的副本,避免修改原始数据 filled_df = df.copy() for column in filled_df: # 不管列有没有空值,直接用众数填充(原Lambda逻辑也会处理无空值的列,不影响) filled_df[column] = filled_df[column].fillna(filled_df[column].mode()[0]) # 循环结束后返回处理好的完整DataFrame return filled_df
说明:原Lambda函数会对所有列执行填充操作(即使列没有空值,fillna也不会改变数据),所以第二种方式里可以去掉if df[column].isnull().any()的判断,保持和原逻辑一致;如果想优化,保留判断也可以,只处理有缺失值的列,效果相同。
内容的提问来源于stack exchange,提问作者Dani
相关产品推荐
相关产品推荐

