如何用for循环合并DataFrame中重复影片的制作公司至单行
解决影片制作公司合并的DataFrame处理方案
核心解决方案:使用Pandas分组聚合(替代低效的for循环)
直接利用Pandas的groupby()+agg()方法完成合并,这比手动写for循环高效得多,且代码简洁可靠。
步骤1:模拟你的数据场景
先构造和你数据结构一致的示例,方便理解:
import pandas as pd data = { 'title': ['Avatar', 'Avatar', 'Titanic', 'Titanic', 'Inception'], 'id': [1, 1, 2, 2, 3], 'revenue': [2847246203, 2847246203, 2201647264, 2201647264, 825532764], 'comp_name': ['20th Century Fox', 'Lightstorm Entertainment', 'Paramount Pictures', '20th Century Fox', 'Warner Bros.'] } df = pd.DataFrame(data)
步骤2:执行合并操作
按影片id(唯一标识,比title更可靠,避免重名影片)分组,将同一影片的制作公司合并为字符串(或列表),其他字段取唯一值(同一id的title、revenue理论上完全一致):
# 合并制作公司为逗号分隔的字符串,也可以用list(x)转成列表格式 merged_df = df.groupby('id').agg( title=('title', 'first'), revenue=('revenue', 'first'), comp_names=('comp_name', lambda x: ', '.join(x)) ).reset_index()
执行后merged_df的结果:
| id | title | revenue | comp_names |
|---|---|---|---|
| 1 | Avatar | 2847246203 | 20th Century Fox, Lightstorm Entertainment |
| 2 | Titanic | 2201647264 | Paramount Pictures, 20th Century Fox |
| 3 | Inception | 825532764 | Warner Bros. |
可选:添加数据校验(避免异常数据)
如果担心同一id下的title/revenue存在不一致的异常情况,可以加校验逻辑:
def validate_unique(series): if series.nunique() != 1: raise ValueError(f"ID {series.name} 存在不一致的字段值") return series.iloc[0] merged_df = df.groupby('id').agg( title=('title', validate_unique), revenue=('revenue', validate_unique), comp_names=('comp_name', ', '.join) ).reset_index()
为什么不推荐用for循环?
手动for循环处理这类场景不仅代码繁琐,而且面对大数据量时,Pandas的向量化分组操作速度是for循环的几十甚至上百倍,同时能避免循环中容易出现的重复赋值、遗漏数据等bug。
内容的提问来源于stack exchange,提问作者Data_Hero_21
相关产品推荐
相关产品推荐

