使用Pandas将分类数据转换为数值数据时遇长度不匹配错误及批量编码高效实现的咨询
Pandas将分类数据转换为数值数据时遇长度不匹配错误及批量编码高效实现的咨询
嘿,我来帮你搞定这个Pandas编码的问题~
先解决你遇到的第一个错误:长度不匹配
你碰到的ValueError: Columns must be same length as key,原因完全如你所想:当用pd.get_dummies()处理job这类分类列时,会生成多列(比如job有12种不同类别,drop_first=True后会得到11列),但你试图把这11列赋值回原来的单个job列,列数和长度不匹配,自然会报错。
你手动写的concat+drop方法是正确的单个列处理方式,但如果要批量处理所有分类列,我们有更高效的办法。
批量处理所有分类列的高效方案
你之前的循环代码有两个小问题导致失效:一是拼写错误(dro_first应该是drop_first),二是错误地试图把多列编码结果赋值回原数据框的单一列。下面给你两种简洁高效的批量编码方法:
方法1:分离分类/数值列后合并
先把分类列和数值列分开,对整个分类列数据框做编码,再合并回数值列:
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 读取数据 path="bank-full.csv" df = pd.read_csv(path) # 分离分类列与数值列 df_cat = df.select_dtypes(include=['object']) df_num = df.select_dtypes(include=np.number) # 对所有分类列批量执行one-hot编码,drop_first避免多重共线性 df_cat_encoded = pd.get_dummies(df_cat, drop_first=True) # 合并数值列和编码后的分类列,得到最终数据集 df_final = pd.concat([df_num, df_cat_encoded], axis=1) # 查看编码后的数据类型(都是数值型) print(df_final.dtypes)
方法2:直接对原数据框指定列编码(更简洁)
不需要提前分离列,直接指定要编码的分类列,Pandas会自动替换原分类列为编码后的多列:
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns path="bank-full.csv" df = pd.read_csv(path) # 获取所有分类列的列名 cat_cols = df.select_dtypes(include=['object']).columns # 直接对原数据框的分类列做编码,保留其他数值列 df_final = pd.get_dummies(df, columns=cat_cols, drop_first=True) # 验证结果 print(df_final.head())
为什么你之前的循环代码没生效?
- 拼写错误:你写的
dro_first少了一个p,正确参数是drop_first,导致编码逻辑没正确执行,原列类型还是object - 赋值逻辑错误:循环中
df_cat[col] = pd.get_dummies(...)试图把多列编码结果赋值给原数据框的单个列,这不符合Pandas的赋值规则,自然无法完成类型转换
备注:内容来源于stack exchange,提问作者Jacky Brian
相关产品推荐
相关产品推荐

