如何合并仅流媒体服务列值不同的重复电影数据行?
电影数据库合并:流媒体上线状态列的合并处理
我正在清洗一个由4个流媒体服务的电影CSV文件合并而成的数据库,部分电影同时在多个平台(如Prime和Hulu)上线。已经通过代码movies.groupby(compareColumns, group_keys=False)[allColumns].apply(lambda x: x.ffill().bfill())完成了其余列的合并,但目前剩余部分行仅onPrime/onNetflix等二进制状态列(0=未上线,1=已上线)值不同,其余内容完全一致。
现有数据示例
| name | onPrime | onHulu | otherColumn |
|---|---|---|---|
| Movie 1 | 1 | 0 | X |
| Movie 1 | 0 | 1 | X |
目标输出
| name | onPrime | onHulu | otherColumn |
|---|---|---|---|
| Movie 1 | 1 | 1 | X |
我尝试过filledgroups.fillna(value=0, axis=0, inplace=True, limit=1),但该操作会填充其他列的空值,而我仅需将onPrime/onHulu等列的0合并为1,不影响其他列。
解决方案
可以利用groupby结合聚合函数实现:对于流媒体状态列,用max函数——因为只要同一电影有一行显示已上线(值为1),合并后就应该保留1;其他内容一致的列,用first或max均可(因为值完全相同,结果无差异)。
代码示例1:分列指定聚合规则
# 定义流媒体状态列的列表 streaming_cols = ['onPrime', 'onHulu', 'onNetflix'] # 筛选出其他列 other_cols = [col for col in movies.columns if col not in streaming_cols] # 分组聚合:其他列取第一个值,流媒体列取最大值 merged_movies = movies.groupby(compareColumns, group_keys=False).agg( **{col: 'first' for col in other_cols}, **{col: 'max' for col in streaming_cols} )
代码示例2:简洁版(适用于其他列内容完全一致的情况)
如果其他列经过之前的ffill/bfill后已经完全一致,直接对整个DataFrame用max聚合即可:
merged_movies = movies.groupby(compareColumns).max().reset_index()
max对字符串类型的列也能正常返回相同的值(因为所有行值一致),对流媒体列则会保留1的状态,完美符合需求。
内容的提问来源于stack exchange,提问作者george
相关产品推荐
相关产品推荐

