使用for循环结合get_dummies转换分类变量遇空DataFrame问题求助
问题出在哪?
你的代码有两个关键错误:
- 循环里的
i是列名的字符串,i[:]依然是字符串,不是数据集里的对应列。pd.get_dummies拿字符串当输入,自然生成空DataFrame。 - 每次循环都直接给
df_new赋值,之前处理的结果全被覆盖了,而且原数据里的数值特征也完全没保留。
怎么改?
给你两种可行的写法:
写法一:用循环逐个处理分类列
先把原数据里的数值特征保留下来,再遍历分类列做编码合并:
# 先把数值特征复制到新数据集,避免丢数据 df_new = df_balanced.select_dtypes(exclude=['object']).copy() # 遍历前n-1列(和你原代码逻辑一致) for col in df_balanced.columns[:-1]: # 判断是不是分类列(object类型) if df_balanced[col].dtype == 'object': # 对当前列做独热编码,prefix加列名避免重复,drop_first减少冗余 dummy_data = pd.get_dummies(df_balanced[col], prefix=col, drop_first=True) # 把编码后的列合并到新数据集里 df_new = pd.concat([df_new, dummy_data], axis=1)
写法二:不用循环,直接一键处理(更简洁)
pd.get_dummies本身可以自动识别分类列,不用手动循环:
# 直接对前n-1列做独热编码,自动处理所有object类型列,drop_first去重 df_new = pd.get_dummies(df_balanced.iloc[:, :-1], drop_first=True, dtype=int)
这里iloc[:, :-1]对应你原代码里的columns[:-1],也就是排除最后一列;drop_first=True和你原逻辑一致,dtype=int是让编码结果用整数0/1,可选。
内容的提问来源于stack exchange,提问作者Jaspreet Singh
相关产品推荐
相关产品推荐

