使用numpy/pandas如何快速将相同唯一标识的多行合并为单行?
优化方案
你原有代码运行慢的核心原因是使用了逐行遍历的循环逻辑,还存在链式索引赋值的问题,完全没有利用pandas的向量化运算特性,因此数据量稍大就会非常慢。
可以用分组+宽表转换的方案实现需求,性能提升可达数百倍,3万行数据可以在毫秒级完成:
- 给每个贷款ID下的借款人生成排序编号,主借款人标记为
main,共同借款人按顺序生成1、2、3……的序号
import pandas as pd # 排序保证同贷款ID的记录在一起,且主借款人排在每组最前面 co_ap.sort_values(by=['Loan No.', 'Borroer'], ascending=[True, False], inplace=True) # 按贷款ID分组,生成组内借款人序号 co_ap['borrower_rank'] = co_ap.groupby('Loan No.').cumcount().map(lambda x: 'main' if x == 0 else f'coap_{x}')
- 通过透视表将长表转成宽表,每个贷款ID仅保留一行
# 生成透视表 result = co_ap.pivot(index='Loan No.', columns='borrower_rank', values='Age').reset_index() # 调整列名符合你的需求 result.columns.name = None col_rename_map = {'main': 'ST_Age_main'} max_coap_count = co_ap['borrower_rank'].nunique() - 1 for i in range(1, max_coap_count + 1): col_rename_map[f'coap_{i}'] = f'ST_Age_coap_{i}' result = result.rename(columns=col_rename_map)
如果需要保留每个贷款ID对应的其他固定字段(比如贷款金额、申请时间等全局唯一字段),只需要将这些字段也添加到pivot的index参数中即可:
# 示例:保留贷款金额、申请时间两个字段 result = co_ap.pivot(index=['Loan No.', 'loan_amount', 'apply_date'], columns='borrower_rank', values='Age').reset_index()
内容的提问来源于stack exchange,提问作者Shubham Batra
相关产品推荐
相关产品推荐

