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

如何遍历Pandas DataFrame并按需生成新列(解决合并重复列问题)

解决按Type生成C、D列时的重复列问题

原代码的核心问题是每次循环merge会把原DataFrame和筛选后的df1(包含重复的A/B/Type列)合并,导致系统自动给重复列加_x/_y后缀,越循环列越多。下面是几种更简洁高效的解决方案:

方案1:直接在原DataFrame上生成C、D列(推荐)

修改函数,让它能接收整行数据,自动读取Type值,然后直接用apply一次性生成两列,完全避免合并操作:

import pandas as pd

df = pd.DataFrame([[1,5,'Dog'],[2,6,'Dog'],[3,7,'Cat'],[4,8,'Cat']],columns=['A','B','Type'])

def ext_fun(row):
    # 直接从行中获取Type、A、B
    type_val = row['Type']
    x1 = row['A']
    x2 = row['B']
    
    if type_val == 'Dog':
        # 替换为Dog对应的实际计算逻辑
        return ['c_dog','d_dog']
    elif type_val == 'Cat':
        # 替换为Cat对应的实际计算逻辑
        return ['c_cat','d_cat']

# 一次性生成C、D列
df[['C','D']] = df.apply(ext_fun, result_type='expand', axis=1)

方案2:按Type分组处理

如果不同Type的计算逻辑差异很大,用groupby分组后单独处理,再合并回原DataFrame,不会产生重复列:

def process_group(group):
    type_val = group['Type'].iloc[0]
    # 根据Type执行对应计算
    if type_val == 'Dog':
        group[['C','D']] = group.apply(lambda x: ['c_dog','d_dog'], axis=1, result_type='expand')
    elif type_val == 'Cat':
        group[['C','D']] = group.apply(lambda x: ['c_cat','d_cat'], axis=1, result_type='expand')
    return group

# 分组处理后合并
df = df.groupby('Type').apply(process_group).reset_index(drop=True)

方案3:保留原函数参数形式的改进版

如果不想修改原函数的参数结构,可以在apply时直接传递当前行的Type值,避免循环筛选和merge:

def ext_fun(x1,x2,i):
    if i=='Dog':
        return ['c_dog','d_dog']
    if i=='Cat':
        return ['c_cat','d_cat']

# 直接对每行调用函数,传递A、B、Type参数
df[['C','D']] = df.apply(lambda x: ext_fun(x['A'], x['B'], x['Type']), result_type='expand', axis=1)

方案优势

  • 彻底避免了循环中的merge操作,不会产生重复列
  • 代码更简洁,执行效率更高(适配你提到的10-15种Type、数百条记录的场景)
  • 逻辑清晰,后续新增Type的计算逻辑时扩展更方便

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:50:27