You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中高效复制含多个有效Applct_Id的记录?

高效处理Pandas多ID字段的行拆分需求

针对40万条量级的DataFrame,要完成将多列非空Applct_Id拆分为单独行的需求,必须用矢量化操作避免循环,以下是两种高效实现方案:

方案一:使用melt函数(推荐,适配任意数量的ID列)

melt是Pandas内置的宽表转长表工具,完全矢量化处理,性能最优。

步骤示例:

  1. 先定义示例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']
})
  1. 执行拆分操作:
# 提取所有以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 11:06:08