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

Pandas:按Type调用函数生成新列后合并回原DataFrame的重复列问题

问题解决:避免Pandas合并时生成重复列,按Type调用函数生成新列

原代码问题分析

你当前的循环合并逻辑会导致重复列(如A_x、A_y),原因是每次处理后的df1包含原DataFrame的所有列(A、B、Type),合并时会把原列和处理后的列重复拼接,后续迭代会因为列名混乱报错。下面给出三种更高效的解决方案,无需合并操作即可生成目标列。


方案一:直接逐行Apply(最简洁)

直接对每行数据调用函数,利用result_type='expand'将返回的列表拆分为C、D两列,无需循环和合并:

import pandas as pd

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

def ext_fun(row):
    x1, x2, typ = row['A'], row['B'], row['Type']
    if typ == 'Dog':
        # 这里替换为Dog类型的实际计算逻辑
        return [f'Dog{x1} Value', f'Dog{x2} Value']
    elif typ == 'Cat':
        # 这里替换为Cat类型的实际计算逻辑
        return [f'Cat{x1} Value', f'Cat{x2} Value']

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

执行后即可得到目标DataFrame,无重复列问题。


方案二:按Type分组处理(适合批量优化)

如果同类型(Type)的计算可以批量处理(比如用向量运算替代逐行循环),用groupby.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 process_type_group(group):
    current_type = group['Type'].iloc[0]
    # 针对当前类型批量计算C、D列
    if current_type == 'Dog':
        group['C'] = group['A'].apply(lambda x: f'Dog{x} Value')
        group['D'] = group['B'].apply(lambda x: f'Dog{x} Value')
    elif current_type == 'Cat':
        group['C'] = group['A'].apply(lambda x: f'Cat{x} Value')
        group['D'] = group['B'].apply(lambda x: f'Cat{x} Value')
    return group

# 分组处理后合并结果
df = df.groupby('Type', group_keys=False).apply(process_type_group)

方案三:修改原循环逻辑(保留Type遍历习惯)

如果坚持按Type唯一值遍历,只需修改赋值方式,避免全量合并,直接将计算结果赋值回原DataFrame对应行:

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(x1,x2,i):
    if i=='Dog':
        # Dog类型计算逻辑
        return [f'Dog{x1} Value', f'Dog{x2} Value']
    if i=='Cat':
        # Cat类型计算逻辑
        return [f'Cat{x1} Value', f'Cat{x2} Value']

for i in df['Type'].unique():
    # 筛选当前Type的行
    mask = df['Type'] == i
    # 计算C、D列
    temp_result = df[mask].apply(lambda x: ext_fun(x['A'], x['B'], i), axis=1, result_type='expand')
    # 直接赋值回原DataFrame
    df.loc[mask, ['C', 'D']] = temp_result

方案选择建议

  • 若计算逻辑是逐行独立的,优先选方案一,代码最简洁易维护。
  • 若同类型数据有批量优化空间(比如用Numpy向量运算),优先选方案二,性能更优。
  • 若需要保留按Type单独处理的逻辑,选方案三,对原代码改动最小。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:30:48