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

Python中基于列生成新行及DataFrame append报错解决咨询

问题解决:DataFrame无append属性及需求实现

问题背景

原始数据集

hiring_mgr_id   candidate_id      candidate_name       emp_id       emp_name
    1000            1234               Joe                4321        Mike
    1000            1234               Joe                9876        Sam
    1000            1234               Joe                5674        Rob

需求

按hiring_mgr_id分组,若分组内的candidate_id不在该分组的emp_id列中,则新增一行,将emp_id和emp_name分别填充为对应的candidate_id和candidate_name。

期望结果

hiring_mgr_id      candidate_id      candidate_name      emp_id    emp_name
     1000                1234                Joe            4321        Mike
     1000                1234                Joe            9876        Sam
     1000                1234                Joe            5674        Rob
     1000                1234                Joe            1234        Joe

错误代码及报错

原代码:

new_row = [] 
for index, row  in df.iterrows():
    candidate_id= row['candidate_id']
    emp_id = row['emp_id']
    if candidate_id not in df['emp_id'].values:
       new_row.append({'hiring_mgr_id:row['hiring_mg'r_id],
       'candidate_name':row['candidate_name'],
       'emp_id':row['emp_id'],
       'emp_name': row['emp_name']
df = df.append(new_row,ignore_index = True) 

运行报错:'DataFrame' object has no attribute 'append'

问题分析

  1. append方法移除:pandas 2.0及以上版本正式移除了DataFrame.append()方法,官方推荐使用pd.concat()替代。
  2. 语法错误:原代码存在引号嵌套错误('hiring_mgr_id:row['hiring_mg'r_id])、字典未闭合的问题。
  3. 逻辑错误:原代码新增行的emp_id和emp_name用了原行的emp字段值,不符合需求;同时没有按hiring_mgr_id分组检查,而是全局检查,逻辑不符合需求。

修正后的代码实现

import pandas as pd

# 构造示例数据集
data = {
    'hiring_mgr_id': [1000, 1000, 1000],
    'candidate_id': [1234, 1234, 1234],
    'candidate_name': ['Joe', 'Joe', 'Joe'],
    'emp_id': [4321, 9876, 5674],
    'emp_name': ['Mike', 'Sam', 'Rob']
}
df = pd.DataFrame(data)

new_rows = []

# 按hiring_mgr_id分组处理,确保每个分组独立检查
for mgr_id, group in df.groupby('hiring_mgr_id'):
    # 取当前分组的candidate信息(假设同一分组内candidate_id/name一致)
    candidate_id = group['candidate_id'].iloc[0]
    candidate_name = group['candidate_name'].iloc[0]
    # 检查当前分组的emp_id中是否不包含该candidate_id
    if candidate_id not in group['emp_id'].values:
        # 构造符合需求的新增行
        new_row = {
            'hiring_mgr_id': mgr_id,
            'candidate_id': candidate_id,
            'candidate_name': candidate_name,
            'emp_id': candidate_id,
            'emp_name': candidate_name
        }
        new_rows.append(new_row)

# 用pd.concat合并原数据和新增行,替代已移除的append方法
if new_rows:
    new_df = pd.DataFrame(new_rows)
    df = pd.concat([df, new_df], ignore_index=True)

# 输出结果
print(df)

代码说明

  • 用groupby('hiring_mgr_id')实现分组逻辑,确保每个招聘经理的分组独立检查
  • 针对每个分组,验证candidate_id是否存在于该分组的emp_id中
  • 用pd.concat()合并原DataFrame和新生成的DataFrame,完全替代append的功能
  • 修正了原代码的语法和逻辑错误,确保新增行符合需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:03:22