如何修正Python代码以正确生成电影类型计数列?
修正Python代码生成电影类型计数列
需要修正Python代码,以正确生成电影类型的计数列。以下是原代码、问题分析及修正方案:
原代码
import numpy as np import pandas as pd df=pd.read_csv("titles.csv",encoding='latin-1') import ast L = df['genres'].apply(ast.literal_eval).explode().unique().tolist() i=0 index=[] while i<19: index.append(L[i]) i+=1 df_rows=df.shape[0] genre_df=pd.DataFrame(np.zeros((df_rows,len(index))),columns=index) final_df=pd.concat([df,genre_df],axis=1) for row,genre_list in enumerate(final_df.genres): for genre in genre_list: final_df.loc[row,genre]=True final_df.head()
问题分析
- 未解析目标列:
final_df.genres仍是原始字符串,未经过ast.literal_eval解析,遍历genre_list时会逐个读取字符而非电影类型,导致错误赋值。 - 冗余类型限制:手动取前19个类型无必要,且可能遗漏部分类型。
- 数据类型不符:赋值为
True会让类型列变为布尔型,期望输出应为数值型的1/0。 - 效率低下:嵌套循环赋值的方式在数据量大时运行缓慢。
修正方案
方案一:高效循环实现
import pandas as pd import ast # 读取数据并解析genres列为列表 df = pd.read_csv("titles.csv", encoding='latin-1') df['genres'] = df['genres'].apply(ast.literal_eval) # 获取所有唯一电影类型 all_genres = df['genres'].explode().unique().tolist() # 初始化计数数据框,默认值为0 genre_counts = pd.DataFrame(0, index=df.index, columns=all_genres) # 遍历每行类型列表,对应列设为1 for idx, genres in df['genres'].items(): genre_counts.loc[idx, genres] = 1 # 合并原数据与计数列 final_df = pd.concat([df, genre_counts], axis=1) final_df.head()
方案二:用get_dummies快速实现(更简洁)
import pandas as pd import ast df = pd.read_csv("titles.csv", encoding='latin-1') # 解析genres列为列表格式 df['genres'] = df['genres'].apply(ast.literal_eval) # 将列表转为分隔字符串,生成独热编码(计数列) genre_dummies = df['genres'].apply(lambda x: '|'.join(x)).str.get_dummies() # 合并数据 final_df = pd.concat([df, genre_dummies], axis=1) final_df.head()
修正说明
- 先确保
genres列被解析为列表,避免遍历字符串字符的错误。 - 自动获取所有唯一类型,无需手动限制数量。
- 赋值为数值1,保证类型列与期望输出的数值格式一致。
- 两种方案均优化了赋值效率,尤其是方案二利用pandas内置方法,运行速度更快。
内容的提问来源于stack exchange,提问作者Sofia Ordaz
相关产品推荐
相关产品推荐

