如何为嵌套电影类型列表生成正确的Pandas独热编码
解决电影类型嵌套列表的独热编码重复列问题
你遇到的核心问题是**col_two字段存储的是列表而非字符串**,直接用.str方法会报错,且未清理的括号符号导致了重复类别。下面是一步步的解决方案:
第一步:清理列表中的多余字符
因为col_two的每个元素是带[/]/空格的类型字符串组成的列表,我们需要遍历每个列表,把每个类型的多余符号去掉:
# 清理每个列表元素的括号和空格 df3['col_two_clean'] = df3['col_two'].apply( lambda x: [genre.strip('[] ') for genre in x] )
这里strip('[] ')会移除每个类型字符串前后的[、]和空格,比如把'Adventure]'转成'Adventure','[Action'转成'Action',彻底消除重复类别的根源。
第二步:生成独热编码的两种方法
方法1:用pandas的explode + get_dummies
先把嵌套列表拆成每行一个类型,再生成独热编码后按id聚合:
# 拆分列表为多行 df_exploded = df3.explode('col_two_clean') # 生成独热编码 dummies = pd.get_dummies(df_exploded['col_two_clean']) # 按id聚合,保留每个类型的存在标记(1表示存在,0表示不存在) one_hot_matrix = df_exploded[['id']].join(dummies).groupby('id').max()
方法2:用sklearn的MultiLabelBinarizer(更简洁)
直接处理清理后的嵌套列表,一步生成独热编码:
from sklearn.preprocessing import MultiLabelBinarizer mlb = MultiLabelBinarizer() # 生成独热编码矩阵,index用原id one_hot_matrix = pd.DataFrame( mlb.fit_transform(df3['col_two_clean']), columns=mlb.classes_, index=df3['id'] )
为什么之前的方法报错?
你之前尝试的pd.Series.replace或.str方法报错,是因为**col_two的dtype是object,但存储的是列表对象,不是字符串**。.str访问器只适用于字符串类型的Series,所以必须先处理列表内部的元素,而不是直接对Series用字符串方法。
验证结果
运行完上述代码后,你可以用one_hot_matrix.columns查看所有类型列,会发现每个类型只对应唯一一列,没有Adventure和Adventure]这样的重复项了。
内容的提问来源于stack exchange,提问作者Simone Di Claudio
相关产品推荐
相关产品推荐

