如何将DataFrame的append代码改写为pd.concat适配新版Python?
用pd.concat替代DataFrame.append的等价实现方案
原代码通过循环调用DataFrame.append生成目标结构,但新版Pandas已移除该方法。以下是两种符合新版规范的改写方式,逻辑与原代码完全一致:
方式一:先收集数据列表再生成DataFrame(更高效)
import pandas as pd import numpy as np def new_df(df): PayItem = ['E01', 'E40', 'E41', 'E42'] # 提取前28行核心数据 employee_data = df.loc[0:27, ['Employee Number', 'Working Hours', 'Product Commissions', 'Membership Commissions', 'Tips']] rows_list = [] for _, row in employee_data.iterrows(): # 为当前员工生成4条记录并加入列表 rows_list.extend([ {'Key': row['Employee Number'], 'PayItem': PayItem[0], 'Hours': row['Working Hours'], 'Dollars': np.nan}, {'Key': row['Employee Number'], 'PayItem': PayItem[1], 'Hours': ' ', 'Dollars': row['Product Commissions']}, {'Key': row['Employee Number'], 'PayItem': PayItem[2], 'Hours': ' ', 'Dollars': row['Membership Commissions']}, {'Key': row['Employee Number'], 'PayItem': PayItem[3], 'Hours': ' ', 'Dollars': row['Tips']} ]) # 批量生成DataFrame return pd.DataFrame(rows_list)
方式二:用pd.concat合并小DataFrame(严格对应concat替换append的需求)
import pandas as pd import numpy as np def new_df(df): PayItem = ['E01', 'E40', 'E41', 'E42'] employee_data = df.loc[0:27, ['Employee Number', 'Working Hours', 'Product Commissions', 'Membership Commissions', 'Tips']] dfs_collect = [] for _, row in employee_data.iterrows(): # 为单个员工创建包含4行的小DataFrame single_emp_df = pd.DataFrame([ {'Key': row['Employee Number'], 'PayItem': PayItem[0], 'Hours': row['Working Hours'], 'Dollars': np.nan}, {'Key': row['Employee Number'], 'PayItem': PayItem[1], 'Hours': ' ', 'Dollars': row['Product Commissions']}, {'Key': row['Employee Number'], 'PayItem': PayItem[2], 'Hours': ' ', 'Dollars': row['Membership Commissions']}, {'Key': row['Employee Number'], 'PayItem': PayItem[3], 'Hours': ' ', 'Dollars': row['Tips']} ]) dfs_collect.append(single_emp_df) # 一次性合并所有小DataFrame return pd.concat(dfs_collect, ignore_index=True)
改写说明
- 两种方式均避免了原代码中循环
append的低效操作,符合新版Pandas的最佳实践。 - 完全保留原逻辑:每个员工生成4条对应
PayItem的记录,仅E01行保留实际工作时长,其余Hours字段为空格,Dollars对应nan、产品佣金、会员佣金、小费。
内容的提问来源于stack exchange,提问作者ACesar
相关产品推荐
相关产品推荐

