Python:基于Pandas列表型字段生成哑变量的实现方案
解决字符串形式列表生成哑变量的问题
核心思路
先把字符串格式的列表转换成Pandas可识别的真实列表对象,再基于列表生成对应哑变量。
步骤与代码示例
假设你的样例DataFrame如下:
import pandas as pd import ast # 模拟样例数据 df = pd.DataFrame({ 'record_id': [101, 102, 103], 'tech_fields_cited': ["['Y02P 20/10', 'Y02E 10/50']", "['Y02P 20/10']", "['Y02E 10/50', 'Y02T 10/70']"] })
1. 将字符串列表转为真实列表
使用ast.literal_eval解析字符串格式的列表,这是处理合法Python字面量字符串最安全的方式:
df['tech_fields_cited'] = df['tech_fields_cited'].apply(ast.literal_eval)
2. 生成哑变量
提供两种高效实现方式:
方式一:简洁版(适合中小数据集)
直接将列表转为Series,填充缺失值为0后拼接回原DataFrame:
# 对每个列表生成对应分类的1值,其余为0 dummies = df['tech_fields_cited'].apply(lambda x: pd.Series(1, index=x)).fillna(0).astype(int) # 拼接原数据和哑变量 final_df = pd.concat([df, dummies], axis=1)
方式二:高效版(适合大数据集)
通过拆分列表、生成哑变量再分组求和的方式,内存占用更低:
# 将列表拆分为每行一个分类 exploded_df = df.explode('tech_fields_cited') # 生成分类的哑变量 dummies = pd.get_dummies(exploded_df['tech_fields_cited']) # 按记录ID分组求和,还原每条记录的哑变量状态 dummies = dummies.groupby(exploded_df['record_id']).sum().reset_index() # 合并回原DataFrame final_df = pd.merge(df, dummies, on='record_id')
注意事项
- 如果你的字符串列表格式不标准(比如没有引号、单双引号混合),可以用正则表达式提取分类标识,例如:
import re df['tech_fields_cited'] = df['tech_fields_cited'].apply(lambda x: re.findall(r"'([^']+)'", x))
内容的提问来源于stack exchange,提问作者Lusian
相关产品推荐
相关产品推荐

