如何预处理CSV转DataFrame中的多值属性并生成独热编码?
问题描述
- 输入为CSV文件
- CSV文件包含多种数据类型的列:有序值、标称值、数值型值和多值
- 多值列中最少包含1个值,最多包含5个值,输入示例如下:
| Job Perks | Insurance Benefits |
|---|---|
| Online Courses; Certification Programs; Cross Training | Life Insurance; Dental Insurance |
| Leadership Development Programs; Online Courses | Life Insurance; Accident Insurance |
- 多值列预期输出:
| Job Perks_Online Courses | Job Perks_Certification Programs | Job Perks_Cross Training | Job Perks_Leadership Development Programs | Insurance Benefits_Life Insurance | Insurance Benefits_Dental Insurance | Insurance Benefits_Accident Insurance |
|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 0 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 | 1 | 0 | 1 |
- 如何对CSV输入进行预处理并保存为符合上述预期输出的DataFrame?我已能将标称属性预处理为预期输出(示例代码如下),但难以转换多值属性
输入
CSV数据集:本地文件ECP_Unedited.csv
示例代码
# 处理标称属性 import pandas as pd import numpy as np import dtale # 更友好的DataFrame输出工具 nominalColumns = ["Gender", "Marital Status", "Educational Attainment", "Employment Status", "Company Bonus Structure", "Company Medical Plan Type"] multivalueColumns = ["Job Perks", "Professional Development Opportunities", "Insurance Benefits"] df = pd.read_csv('ECP_Unedited.csv') # 转换标称列 newCols = pd.get_dummies(df[nominalColumns], dtype=int) df = df.drop(columns=nominalColumns) df = pd.concat([df, newCols], axis=1) dtale.show(df) # 转换多值列 # 在此插入代码!
解决方案
针对多值列的转换,我们可以通过拆分多值、生成独热编码的方式实现,完整代码如下:
# 处理标称属性 import pandas as pd import numpy as np import dtale # 更友好的DataFrame输出工具 nominalColumns = ["Gender", "Marital Status", "Educational Attainment", "Employment Status", "Company Bonus Structure", "Company Medical Plan Type"] multivalueColumns = ["Job Perks", "Professional Development Opportunities", "Insurance Benefits"] df = pd.read_csv('ECP_Unedited.csv') # 转换标称列 newCols = pd.get_dummies(df[nominalColumns], dtype=int) df = df.drop(columns=nominalColumns) df = pd.concat([df, newCols], axis=1) # 转换多值列 for col in multivalueColumns: # 拆分多值,自动去除每个值前后的空格 split_col = df[col].str.split(';\s*', expand=False) # 生成独热编码并添加原列名前缀 dummy_col = split_col.str.join('|').str.get_dummies(sep='|').add_prefix(f"{col}_") # 合并新列到原DataFrame df = pd.concat([df, dummy_col], axis=1) # 删除原多值列 df = df.drop(columns=col) dtale.show(df)
代码说明
str.split(';\s*', expand=False):用分号加任意空格作为分隔符,确保A; B这类格式能正确拆分成A和Bsplit_col.str.join('|').str.get_dummies(sep='|'):先把拆分后的列表转为|连接的字符串,再生成独热编码,存在对应取值则为1,否则为0add_prefix(f"{col}_"):给新生成的列名添加原列名前缀,和预期输出的命名格式完全匹配
内容的提问来源于stack exchange,提问作者DILF Unboxing
相关产品推荐
相关产品推荐

