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'
问题分析
- append方法移除:pandas 2.0及以上版本正式移除了
DataFrame.append()方法,官方推荐使用pd.concat()替代。 - 语法错误:原代码存在引号嵌套错误(
'hiring_mgr_id:row['hiring_mg'r_id])、字典未闭合的问题。 - 逻辑错误:原代码新增行的
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
相关产品推荐
相关产品推荐

