如何在Pandas中高效复制含多个有效Applct_Id的记录?
高效处理Pandas多ID字段的行拆分需求
针对40万条量级的DataFrame,要完成将多列非空Applct_Id拆分为单独行的需求,必须用矢量化操作避免循环,以下是两种高效实现方案:
方案一:使用melt函数(推荐,适配任意数量的ID列)
melt是Pandas内置的宽表转长表工具,完全矢量化处理,性能最优。
步骤示例:
- 先定义示例DataFrame(模拟你的数据结构):
import pandas as pd import numpy as np df = pd.DataFrame({ 'APPN': ['A001', 'A002', 'A003'], 'Name': ['张三', '李四', '王五'], 'Age': [25, 30, 28], 'Applct_Id_1': ['ID001', None, 'ID005'], 'Applct_Id_2': ['ID002', 'ID004', None], 'Applct_Id_3': [None, 'ID003', 'ID006'] })
- 执行拆分操作:
# 提取所有以Applct_Id_开头的列作为要拆分的ID列 id_columns = [col for col in df.columns if col.startswith('Applct_Id_')] # 宽表转长表,保留非ID字段作为标识列 melted_df = df.melt( id_vars=df.columns.difference(id_columns), # 自动获取所有非ID字段,无需硬编码 value_vars=id_columns, value_name='ID_Number' ) # 过滤掉ID_Number为None的行,重置索引 result_df = melted_df.dropna(subset=['ID_Number']).reset_index(drop=True)
方案二:使用wide_to_long函数(适合ID列命名规则统一的场景)
如果你的Applct_Id列是严格的Applct_Id_数字格式,wide_to_long写法更简洁:
# 重命名列,让wide_to_long能识别后缀数字 df_renamed = df.rename(columns=lambda x: x.replace('Applct_Id_', 'Applct_Id.')) # 执行转换 long_df = pd.wide_to_long( df_renamed, stubnames='Applct_Id', i=df.columns.difference([col for col in df.columns if col.startswith('Applct_Id_')]), j='ID_Index' # 可选字段,记录原ID列的序号,不需要可后续删除 ).reset_index() # 过滤空值并重命名列 result_df = long_df.dropna(subset=['Applct_Id']).rename(columns={'Applct_Id': 'ID_Number'}).reset_index(drop=True)
性能说明
- 两种方案都是Pandas底层优化的矢量化操作,处理40万条数据的时间通常在几秒内完成,远快于循环或
apply方法。 - 若后续需扩展更多ID列,代码无需修改,自动适配新增的
Applct_Id_*字段。
内容的提问来源于stack exchange,提问作者Hummer
相关产品推荐
相关产品推荐

