如何高效将Pandas DataFrame中的id字符串批量转换为对应名称字符串
高效实现Pandas多ID映射为名称的方案
你之前的方案运行极慢的核心原因是:每次在自定义getNames函数中执行按nconst过滤的布尔索引,都会全表扫描name_basics,时间复杂度为两张表行数的乘积,数据量大时必然出现指数级卡顿。
实现方案
方案1:字典映射法(代码最简洁,可应对千万级以下数据)
先把name_basics转换为O(1)查找的映射字典,完全避免反复全表扫描:
# 第一步:构建nconst到对应姓名的映射字典 name_map = name_basics.set_index('nconst')['primaryName'].to_dict() # 第二步:批量替换directors列的ID为姓名 title_directors['directors'] = title_directors['directors']\ .str.split(',')\ .apply(lambda x: ','.join([name_map.get(id, id) for id in x]))
name_map.get(id, id)的作用是如果遇到不存在的nconst,会保留原ID不会报错,你也可以根据需求把第二个参数替换为未知这类默认值。
方案2:爆炸+合并法(性能最优,适合超大数据量)
完全使用Pandas向量化操作,避免任何Python层的循环,性能比方案1高30%以上:
# 第一步:把同一条多ID的行拆分为单行单ID temp_df = title_directors.assign( directors = title_directors['directors'].str.split(',') ).explode('directors') # 第二步:左连接匹配对应姓名 temp_df = temp_df.merge( name_basics, left_on='directors', right_on='nconst', how='left' ) # 第三步:按tconst分组拼接同一条目的多个姓名 title_directors = temp_df.groupby('tconst', as_index=False)['primaryName']\ .agg(','.join)\ .rename(columns={'primaryName':'directors'})
两种方案处理百万级数据耗时都在分钟级,远低于你原来预估的80小时运行时间。
内容的提问来源于stack exchange,提问作者alanacevedo
相关产品推荐
相关产品推荐

