You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正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()

问题分析

  1. 未解析目标列:final_df.genres仍是原始字符串,未经过ast.literal_eval解析,遍历genre_list时会逐个读取字符而非电影类型,导致错误赋值。
  2. 冗余类型限制:手动取前19个类型无必要,且可能遗漏部分类型。
  3. 数据类型不符:赋值为True会让类型列变为布尔型,期望输出应为数值型的1/0。
  4. 效率低下:嵌套循环赋值的方式在数据量大时运行缓慢。

修正方案

方案一:高效循环实现

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 20:20:18