如何使用Pandas将特征列表列拆分为多列并赋值?
使用Pandas拆分CSV中的特征列表列
问题场景
我有一个包含9列的CSV文件,最后一列Labels Name List是特征列表,数据示例如下:
First Name Last Name Email Grad Date Major List Appointments Count Advising Time Labels Count Labels Name List 0 Adrien Yanez ayaneza@twitter.com NaN Psychology: Neuroscience 12 325 18 acad_stat=gr, class_code=sr, sess=fa, re_id=11... 1 Aindrea Braams abraams3v@nps.gov NaN Psychology: Neuroscience 4 120 17 cx_id=600852, re_id=1114446, primary_departmen... 2 Alida Swinburne aswinburne52@cyberchimps.com 5/1/2022 Psychology 1 30 14 re_id=1124407, primary_department=psychology, ...
需求目标:将Labels Name List列中的每个标签/特征作为新列名,列值为标签后=符号后的内容;若标签无=符号,则列值设为1;若某行不存在对应标签,列值设为None或0。
示例输入特征列表:
adv1=syed ahmad, cx_id=616758, re_id=1112539, slate_id=, class_session=spring, class_yr=2018, advd=joseph atkins, adv2=, not labeled seniors 2022
示例拆分后输出:
adv1 cx_id re_id slate_id class_session class_yr advd adv2 not labeled seniors 2022 0 syed admad 616758 1112539 1 spring 2018 joseph atkins 1 1
解决方案
1. 读取CSV数据
先加载目标CSV文件:
import pandas as pd df = pd.read_csv('your_file.csv')
2. 定义标签解析函数
编写函数处理每行的特征字符串,将其转为键值对字典:
def parse_labels(label_str): if pd.isna(label_str): return {} # 分割标签并去除首尾空格 labels = [item.strip() for item in label_str.split(',')] label_dict = {} for label in labels: if '=' in label: # 仅分割第一个等号,避免值中包含等号导致错误 key, value = label.split('=', 1) # 空值标签设为1,否则保留原值 label_dict[key] = value if value else 1 else: # 无等号的标签值设为1 label_dict[label] = 1 return label_dict
3. 生成标签列并合并数据
将解析后的字典转为DataFrame,再与原数据合并:
# 对每行的Labels Name List应用解析函数 label_dicts = df['Labels Name List'].apply(parse_labels) # 转换为DataFrame,缺失值填充为None(或替换为0) label_df = pd.DataFrame(label_dicts.tolist()).fillna(None) # 合并原数据与新标签列,移除原Labels Name List列 result_df = pd.concat([df.drop('Labels Name List', axis=1), label_df], axis=1)
4. 输出结果
查看或保存处理后的数据:
# 打印前几行验证 print(result_df.head()) # 保存到新CSV文件 result_df.to_csv('split_labels_result.csv', index=False)
关键说明
- 使用
split('=', 1)确保只分割第一个等号,兼容标签值包含等号的场景; - 空值标签(如
slate_id=)自动设为1; - 缺失的标签列默认填充
None,若需要数值0,可将fillna(None)改为fillna(0); - 合并后保留原数据所有列,仅移除原特征列表列。
内容的提问来源于stack exchange,提问作者Nader Shehata
相关产品推荐
相关产品推荐

