假设有个Excel 2007文件“电影导演演员.xlsx”,其中有三列分别为电影名称、导演和演员列表(同一个电影可能会有多个演员,每个演员姓名之间使用逗号分隔),现在要求统计每个演员的参演电影分别是哪些。
这是网上搜到的代码;
import openpyxl
from openpyxl import Workbook
def getActors(filename):
actors = dict()
wb = openpyxl.load_workbook(filename)
ws = wb.worksheets[0]
for index, row in enumerate(ws.rows):
if index == 0:
continue
filmName, actor = row[0].value, row[2].value.split(',')
for a in actor:
actors[a] = actors.get(a, set())
actors[a].add(filmName)
return actors
actors = getActors('电影导演演员.xlsx')
actors = sorted(actors.items(),key=lambda x:int(x[0][2:]))
for item in actors:
print(item)
运行后出现错误
ValueError: invalid literal for int() with base 10: '1,演员2,演员3,演员4'
请问是什么原因
提供个思路不用写这么多:
1 先读取数据
2 读取后的数据对演员分列, 生成很多新的列
3 分列后的数据用pd.melt() 宽边转窄表
4 数据透视, 统计每个演员参演的电影
主要的代码:
# 导入工具包
import pandas as pd
import numpy as np
# 读取数据
data = pd.read_csv('路径')
data.columns=['电影名称','导演','主演']
data_zy = data['主演'].str.split(',',expand=True)
data2 = pd.concat([data['电影名称'],data_zy],axis=1)
data3 = pd.melt(data2,id_vars='电影名称')
data3.drop('variable',axis=1,inplace=True)
data3.columns= ['电影名称','主演']
result3 = data3.groupby('主演')['电影名称'].count().sort_values(ascending=False).reset_index()