You need to enable JavaScript to run this app. pandas拼接Series到DataFrame时如何避免重复列名合并有效数据
优惠活动
大模型
产品
解决方案
定价
更多

pandas拼接Series到DataFrame时如何避免重复列名合并有效数据

大数据量下无重复列拼接实现方案

原逻辑中循环内执行pd.concat会反复复制全量DataFrame,10万行规模下100次拼接会产生大量冗余内存操作,同时重复列的合并还需要额外遍历开销。以下两种方案均适配Python 3.7,可将拼接合并的耗时降低1~2个数量级。

最优实现:预分配目标列,按行索引直接填充(固定列名场景)

核心思路:

  • 提前基于已知的返回列名,在主DataFrame上初始化对应列,全部填充NaN,长度与主表一致
  • 循环中计算得到子集结果后,不执行拼接,直接按行索引将有效值填入预分配的列中
  • 全程无多余的全量数据复制,完全不会产生重复列

示例代码:

import pandas as pd
import numpy as np

def myfcn(row, data, val):
    z1 = row['y'] + val
    z2 = row['x']*row['y']
    return pd.Series(
        {'fancy_column_name1': z1, 
         'fancy_column_name2': z2/val},
        name=row.name
    )

col1 = [1, 1.5, 3.1, 3.4, 2, -1]
col2 = [1, -3, 2, 8, 2.5, -1.3]
df = pd.DataFrame(list(zip(col1, col2)), columns=['x', 'y'])

# 预分配目标列,用numpy初始化速度快于纯pandas实现
target_cols = ['fancy_column_name1', 'fancy_column_name2']
for col in target_cols:
    df[col] = np.nan

# 第一次循环处理子集
df_subset = df.iloc[[0,2,3]]
out = df_subset.apply(myfcn, axis=1, args=(df_subset, 100))
# 按索引匹配填充有效值,pandas自动处理行对齐
df.loc[out.index, target_cols] = out.values

# 第二次循环处理子集
df_subset2 = df.iloc[[5]]
out = df_subset2.apply(myfcn, axis=1, args=(df_subset2, 250))
df.loc[out.index, target_cols] = out.values

display(df)

次优实现:批量收集结果一次性合并(列名不固定场景)

如果自定义函数返回的列名不固定,无法提前预分配,可先将所有循环的计算结果存入列表,循环结束后一次性拼接合并,避免多次全量拼接的开销。
核心思路:

  • 循环内仅将结果存入列表,不执行任何拼接操作
  • 所有循环结束后,一次性拼接所有结果,按列名分组取每一行的非NaN有效值,再拼到主表上

示例代码:

out_list = []

# 循环内仅收集结果,不执行concat
df_subset = df.iloc[[0,2,3]]
out = df_subset.apply(myfcn, axis=1, args=(df_subset, 100))
out_list.append(out)

df_subset2 = df.iloc[[5]]
out = df_subset2.apply(myfcn, axis=1, args=(df_subset2, 250))
out_list.append(out)

# 所有循环完成后一次性拼接
all_out = pd.concat(out_list, axis=1)
# 按列名分组,取每行第一个非NaN值(符合业务规则:同一行无多个有效数值)
all_out_merged = all_out.groupby(level=0, axis=1).first()
# 一次性拼到主DataFrame
df = pd.concat([df, all_out_merged], axis=1)

display(df)

注意事项

  • 10万行规模下,上述两种方案的列合并耗时均在毫秒级,远优于原循环内拼接的逻辑
  • 若业务规则中存在同一行多个非NaN值的冲突场景,可将.first()替换为.min()/.max()或自定义聚合函数
  • 若myfcn的逐行apply是性能瓶颈,可进一步将函数改写为向量化实现,该优化与拼接逻辑独立

内容的提问来源于stack exchange,提问作者a11

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 03:36:03