如何遍历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
相关产品推荐
相关产品推荐

