如何编写Python函数对DataFrame的数值列执行MinMaxScaler归一化?
问题修正与代码优化
你的代码存在几个关键错误,导致出现'type' object is not iterable报错,同时逻辑上也有漏洞,下面是具体的错误分析和修正后的代码:
错误点拆解
- 开头直接把传入的
df赋值为空pd.DataFrame(),直接丢失了输入的原始数据,这是致命问题。 - 循环遍历的是
pd.DataFrame这个类(类型对象),而非传入的DataFrame的列名,所以会触发类型不可迭代的错误。 - 判断列类型时,
dtype(column)用法错误,应该通过df[column].dtype获取对应列的数据类型。 - 找到第一列就立即
return,后续符合条件的列根本不会被处理,逻辑不完整。
修正后的代码
def standard(df): """接收一个DataFrame,返回标准化int类型数值列后的DataFrame""" from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() # 复制原DataFrame,避免修改输入的原始数据 scaled_df = df.copy() # 筛选所有int类型的列 int_columns = [col for col in scaled_df.columns if 'int' in str(scaled_df[col].dtype)] # 对筛选出的列统一执行MinMax缩放 scaled_df[int_columns] = scaler.fit_transform(scaled_df[int_columns]) return scaled_df
关键修改说明
- 用
df.copy()复制原始数据,保证输入的DataFrame不会被函数修改(这是处理DataFrame时的最佳实践)。 - 遍历
scaled_df.columns获取所有列名,而非遍历DataFrame类,解决了迭代错误。 - 用列表推导式一次性筛选出所有int类型的列,再统一进行缩放,效率更高且逻辑完整。
- 修正了列数据类型的获取方式,确保能正确识别int64类型的列。
内容的提问来源于stack exchange,提问作者Pranav Kale
相关产品推荐
相关产品推荐

