pandas按actor_link分组聚合movie_link为列表的实现方法
Pandas按演员分组聚合参演电影链接问题
问题背景
现有结构为name, actor_link, movie_link的DataFrame,需要按actor_link字段分组,输出包含name、actor_link、演员参演电影链接列表三个字段的结果。
示例输入
Tom Hanks,https://www.csfd.cz/tvurce/330-tom-hanks/,https://www.csfd.cz/film/10135-forrest-gump/ Tom Hanks,https://www.csfd.cz/tvurce/330-tom-hanks/,https://www.csfd.cz/film/2292-zelena-mile/
期望输出
Tom Hanks,https://www.csfd.cz/tvurce/330-tom-hanks/,[https://www.csfd.cz/film/10135-forrest-gump/,https://www.csfd.cz/film/2292-zelena-mile/]
现存问题
当前编写的代码输出存在错误,电影链接列表中混入了演员姓名,错误输出如下:
Tom Hanks,https://www.csfd.cz/tvurce/330-tom-hanks/,"['Tom Hanks', 'https://www.csfd.cz/film/10135-forrest-gump/', 'Tom Hanks', 'https://www.csfd.cz/film/2292-zelena-mile/']"
当前使用的代码:
original_actor_df = pd.read_csv('actors.csv') actor_movies_df = original_actor_df.set_index("actor_link").stack().groupby(level=0).apply(list).reset_index(name="movies") original_actor_df.drop(['movie_link'], axis=1, inplace=True) original_actor_df.drop_duplicates(inplace=True) actor_df = pd.merge(original_actor_df, actor_movies_df, on="actor_link")
解决方法
错误原因
原代码中set_index("actor_link").stack()会将除actor_link外的所有剩余列(包含name和movie_link两列)全部转为长序列,分组聚合时会把两列的所有值都收集到列表中,因此会混入演员姓名。同时原流程包含删列、去重、表合并多步冗余操作,可以通过原生分组聚合逻辑大幅简化。
最简实现代码
直接使用groupby配合聚合函数即可,不需要额外的删列、去重、合并操作:
import pandas as pd original_actor_df = pd.read_csv('actors.csv') # 按actor_link分组聚合 actor_df = original_actor_df.groupby("actor_link", as_index=False).agg( name=("name", "first"), # 同一演员的name完全相同,取第一个值即可 movies=("movie_link", list) # 将同组的movie_link聚合为列表 ) # 调整字段顺序和需求一致 actor_df = actor_df[["name", "actor_link", "movies"]]
如果要沿用原链式写法的思路,只需要将name也加入索引,仅对movie_link列做堆叠聚合即可,效果和上述代码一致:
actor_df = original_actor_df.set_index(["actor_link", "name"])["movie_link"]\ .groupby(level=[0,1])\ .apply(list)\ .reset_index(name="movies")\ [["name", "actor_link", "movies"]]
两种写法输出结果完全匹配预期,没有冗余字段,执行效率更高。
内容的提问来源于stack exchange,提问作者PetrSevcik
相关产品推荐
相关产品推荐

