如何将类似'AlmondCookies'的字符串转为整数适配机器学习模型?
解决方案
方法1:让pd.get_dummies直接输出整数类型
pd.get_dummies默认返回布尔值,但可以通过dtype=int参数直接生成整数类型的二进制特征,无需后续转换,这是最直接的解决方式:
import pandas as pd data = pd.read_csv('food_ingredients_and_allergens-checkpoint.csv') data['Food Product'] = data['Food Product'].str.replace(" ", "") # 指定dtype=int,直接生成整数型哑变量 dummies = pd.get_dummies(data['Food Product'], dtype=int) data = data.join(dummies) # 可选:删除原字符串列 data = data.drop('Food Product', axis=1) print(data.dtypes)
方法2:用LabelEncoder做单列整数映射
如果只需要将每个食品名称映射为唯一整数(非二进制特征),可以用sklearn的LabelEncoder:
import pandas as pd from sklearn.preprocessing import LabelEncoder data = pd.read_csv('food_ingredients_and_allergens-checkpoint.csv') data['Food Product'] = data['Food Product'].str.replace(" ", "") le = LabelEncoder() data['Food Product_Int'] = le.fit_transform(data['Food Product']) # 查看文本与整数的映射关系 print(dict(zip(le.classes_, le.transform(le.classes_)))) print(data[['Food Product', 'Food Product_Int']].head())
方法3:用OneHotEncoder生成整数型独热编码
如果更适配机器学习工作流,想用sklearn的OneHotEncoder生成整数特征:
import pandas as pd from sklearn.preprocessing import OneHotEncoder data = pd.read_csv('food_ingredients_and_allergens-checkpoint.csv') data['Food Product'] = data['Food Product'].str.replace(" ", "") # 初始化编码器,指定输出整数格式 encoder = OneHotEncoder(sparse_output=False, dtype=int) # 拟合并转换数据 one_hot = encoder.fit_transform(data[['Food Product']]) # 转换为DataFrame并合并到原数据 one_hot_df = pd.DataFrame(one_hot, columns=encoder.get_feature_names_out(['Food Product'])) data = pd.concat([data, one_hot_df], axis=1) data = data.drop('Food Product', axis=1) print(data.head())
为什么之前的转换会报错?
你之前直接对字符串列使用astype('int')或pd.to_numeric必然报错,因为这些方法只能转换数字格式的字符串,而'AlmondCookies'这类纯文本字符串无法直接转为数值类型。必须先通过编码映射,将文本关联到整数,或者在生成哑变量时直接指定整数类型。
内容的提问来源于stack exchange,提问作者Sedra
相关产品推荐
相关产品推荐

