Python中DataFrame归一化遇类型错误与语法错误求助
问题解决步骤
1. 先修复语法错误
你修改后的代码存在括号不匹配问题,这是导致SyntaxError的直接原因。看这行代码:
df_min_max_scaled[column] = (df_min_max_scaled[column]) - float(df_min_max_scaled[column].min()) / float((df_min_max_scaled[column].max()) - float(df_min_max_scaled[column].min())
嵌套的float()调用缺少闭合括号,且整个表达式的括号逻辑混乱。不过这行代码的核心逻辑也有问题,根源还是列类型不对,下面会说正确的处理方式。
2. 解决根源问题:字符串列无法做数值运算
第一个错误TypeError: unsupported operand type(s) for -: 'str' and 'str',说明你的DataFrame中存在字符串类型的列,必须先将这些列转换为数值类型(比如float),才能执行归一化的数值运算。
正确的手动实现代码
import pandas as pd # 复制数据 df_min_max_scaled = df.copy() # 遍历列,先转数值类型再做归一化 for column in df_min_max_scaled.columns: # 将列转为float,无法转换的内容设为NaN(避免报错) df_min_max_scaled[column] = pd.to_numeric(df_min_max_scaled[column], errors='coerce') # 获取列的最大最小值,跳过全空或值都相同的列(防止除以0) col_min = df_min_max_scaled[column].min() col_max = df_min_max_scaled[column].max() if col_max != col_min: df_min_max_scaled[column] = (df_min_max_scaled[column] - col_min) / (col_max - col_min) # 查看结果 print(df_min_max_scaled)
关键说明
- 不要只单独转换
min()或max()的结果,因为整个列还是字符串类型,直接做减法依然会报错,必须先把整列转为数值类型。 pd.to_numeric的errors='coerce'参数会把非数值的字符串转为NaN,避免转换过程中直接报错。- 增加
col_max != col_min的判断,防止列中所有值相同导致除以0的错误。
3. 更简洁的实现方式(用sklearn)
如果允许使用第三方库,sklearn的MinMaxScaler可以更高效地完成归一化,还能自动筛选数值列:
from sklearn.preprocessing import MinMaxScaler import pandas as pd scaler = MinMaxScaler() # 筛选出所有数值类型的列 numeric_cols = df.select_dtypes(include=['number']).columns df_min_max_scaled = df.copy() # 仅对数值列执行归一化 df_min_max_scaled[numeric_cols] = scaler.fit_transform(df[numeric_cols]) print(df_min_max_scaled)
内容的提问来源于stack exchange,提问作者kcats_wolf
相关产品推荐
相关产品推荐

