如何使用Pandas基于列表类型的演员字段对电影数据分组统计?
如何基于Pandas中列表类型字段统计演员出现次数
问题背景
你定义了包含title、director、actors(列表类型)的Movie类:
class Movie: def __init__(self, title: str, director: str, actors: list[str]): self.title = title self.director = director self.actors: list[str] = actors
并创建了3个电影实例的列表:
movies = [Movie('Barton Fink', 'Joel Coen', ['John Turturro', 'John Goodman', 'Judy Davis']), Movie('The Big Lebowski', 'Joel Coen', ['Jeff Bridges', 'John Goodman', 'Steve Buscemi', 'John Turturro']), Movie('The Big Easy', 'Jim McBride', ['Dennis Quaid', 'Ellen Barkin', 'John Goodman']), ]
统计导演出现次数的代码可正常运行:
from pandas import DataFrame df = DataFrame([vars(m) for m in movies]) grouped = df.groupby(['director']).size().sort_values(ascending=False) print(grouped)
但尝试基于actors字段分组统计时,因列表为不可哈希类型报错:
df = DataFrame([vars(m) for m in movies]) grouped = df.groupby(['actors']).size().sort_values(ascending=False)
报错信息:
Error: (<class 'TypeError'>, TypeError("unhashable type: 'list'"), <traceback object at 0x00000274C91E4340>)
解决方案:展开列表后统计单个演员频次
列表属于不可哈希类型,无法直接作为分组键。要统计单个演员的出现次数,需先将actors字段的列表展开为单行单元素的形式,再分组统计。
使用Pandas的explode()方法即可实现:
from pandas import DataFrame df = DataFrame([vars(m) for m in movies]) # 将actors列表展开,每个演员单独占一行 exploded_df = df.explode('actors') # 按演员姓名分组,统计出现次数并降序排列 actor_counts = exploded_df.groupby('actors').size().sort_values(ascending=False) print(actor_counts)
运行结果:
actors John Goodman 3 John Turturro 2 Jeff Bridges 1 Steve Buscemi 1 Judy Davis 1 Dennis Quaid 1 Ellen Barkin 1 dtype: int64
补充:按完整演员组合分组(非单演员统计)
如果你的需求是统计完全相同的演员组合出现的次数,可将列表转换为可哈希的元组后再分组:
df = DataFrame([vars(m) for m in movies]) # 将actors列表转换为元组(可哈希类型) df['actors_tuple'] = df['actors'].apply(tuple) # 按元组分组统计 grouped = df.groupby('actors_tuple').size().sort_values(ascending=False) print(grouped)
但显然你需要的是单个演员的频次统计,第一种方法是最优解。
内容的提问来源于stack exchange,提问作者phibel
相关产品推荐
相关产品推荐

