Python案例:如何用Pandas做数据追加——从基础到实战的完整指南
目录导读
- Pandas数据追加的核心概念
- 什么是数据追加(Append)?
- 追加与合并(Merge/Join)的区别
- 使用
append()方法的6个实战案例- 案例1:DataFrame追加单行数据
- 案例2:DataFrame追加多行数据(从列表)
- 案例3:追加另一个DataFrame(列对齐)
- 案例4:列名不匹配时的处理与警告
- 案例5:忽略索引重置(
ignore_index=True) - 案例6:高效追加大数据集(使用
pd.concat)
- 使用
pd.concat()进行复杂追加- 垂直追加(
axis=0)与水平追加(axis=1) - 处理索引重复与标签对齐
- 垂直追加(
- 常见错误与性能优化
- 避免
append在循环中的性能陷阱 - 使用
list积累后再追加的高效方案
- 避免
- 问答环节(FAQ)
- Q1:append被弃用了?现在该用什么替代?
- Q2:追加后为什么会有NaN?如何避免?
- Q3:如何追加CSV或Excel文件中的新数据?
Pandas数据追加的核心概念
什么是数据追加(Append)?
在数据分析中,“追加”指将新数据行添加到现有DataFrame或Series的末尾,类似于在Excel表格底部粘贴新行,Pandas提供两种主要方法:DataFrame.append()(旧版本常用,2.0后不建议)和pd.concat()(推荐方法)。

追加与合并(Merge/Join)的区别
- 追加:基于行索引或列名的垂直/水平拼接,不涉及键值匹配。
- 合并:类似SQL的JOIN操作,通过指定键(key)匹配行后组合列。
关键点:追加适用于结构相同的新数据添加;合并适用于关联不同表格。
使用append()方法的6个实战案例
案例1:DataFrame追加单行数据
import pandas as pd
df = pd.DataFrame({'Name': ['Alice', 'Bob'], 'Score': [85, 92]})
new_row = {'Name': 'Charlie', 'Score': 78}
df = df.append(new_row, ignore_index=True)
print(df)
# 输出:
# Name Score
# 0 Alice 85
# 1 Bob 92
# 2 Charlie 78
注意:ignore_index=True可重置索引,避免原索引混乱。
案例2:DataFrame追加多行数据(从列表)
new_rows = [{'Name': 'David', 'Score': 95}, {'Name': 'Eve', 'Score': 88}]
df = df.append(new_rows, ignore_index=True)
# 或者:from pandas import DataFrame
# new_df = DataFrame(new_rows)
# df = df.append(new_df, ignore_index=True)
要点:列表中的每个字典代表一行,列名需与原DataFrame一致。
案例3:追加另一个DataFrame(列对齐)
other_df = pd.DataFrame({'Name': ['Frank', 'Grace'], 'Score': [73, 91]})
df = df.append(other_df, ignore_index=True)
自动对齐:列顺序不同时,Pandas会按列名匹配,缺失值填NaN。
案例4:列名不匹配时的处理与警告
bad_df = pd.DataFrame({'Name': ['Hank'], 'Grade': ['A']})
df.append(bad_df, ignore_index=True)
# 结果:Score列出现NaN,Grade列为新列加入
警告:默认sort=False,若列名差异大,建议使用pd.concat并指定join='inner'仅保留共同列。
案例5:忽略索引重置(ignore_index=True)
当追加后不想保留原索引,使用此参数让索引从0重新编号。
df = df.append(other_df, ignore_index=True) # 索引0,1,2,3...连续
案例6:高效追加大数据集(使用pd.concat)
推荐方案,尤其是超过10万行时:
all_frames = [df, other_df, more_df] # 预先收集所有DataFrame final_df = pd.concat(all_frames, ignore_index=True)
性能提升原因:append每次调用都会创建新副本,而concat一次性拼接。
使用pd.concat()进行复杂追加
垂直追加(axis=0)与水平追加(axis=1)
- 垂直追加(追加行):
pd.concat([df1, df2], axis=0) - 水平追加(追加列):
pd.concat([df1, df2], axis=1),需保证行数一致。
# 垂直追加(行方向) df_vertical = pd.concat([df1, df2], ignore_index=True) # 水平追加(列方向) df_horizontal = pd.concat([df1, df3], axis=1) # df1和df3行数需相同
处理索引重复与标签对齐
df1 = pd.DataFrame({'A': [1,2]}, index=['x','y'])
df2 = pd.DataFrame({'A': [3,4]}, index=['y','z'])
pd.concat([df1, df2]) # 默认保留原索引,出现y重复
pd.concat([df1, df2], ignore_index=True) # 重置为0,1,2,3
pd.concat([df1, df2], axis=1) # 按索引对齐,缺失数据填NaN
常见错误与性能优化
避免append在循环中的性能陷阱
错误写法:
dfs = []
for file in files:
df = pd.read_csv(file)
dfs.append(df) # 注意这里!这是收集,不是DataFrame的append
final = pd.concat(dfs) # 应在循环外一次性concat
正确做法:用列表存储所有DataFrame,最后pd.concat()。
使用list积累后再追加的高效方案
对于追加100个小文件:
rows_list = [] # 字典列表
for row_data in large_source:
rows_list.append(row_data)
if len(rows_list) >= 10000: # 每1万行导入一次
df_temp = pd.DataFrame(rows_list)
# 写入数据库或文件
rows_list = []
问答环节(FAQ)
Q1:append被弃用了?现在该用什么替代?
答:是的,Pandas 2.0后DataFrame.append()已被标记为弃用(deprecated)。推荐使用pd.concat(),两者语法对比:
- 旧写法:
df.append(new_df, ignore_index=True) - 新写法:
pd.concat([df, new_df], ignore_index=True)
concat更灵活,支持多个表同时拼接,且性能更优。
Q2:追加后为什么会有NaN?如何避免?
常见原因:
- 追加的DataFrame列名与原表不完全一致。
- 索引对齐时缺失值(水平追加常见)。
避免方法:
- 确保列名统一,
df.columns.tolist()对比后修正。 - 使用
join='inner'只保留共有列:pd.concat([df1, df2], join='inner') - 检查数据类型,必要时用
.fillna()填充。
Q3:如何追加CSV或Excel文件中的新数据?
动态追加CSV文件:
new_data = pd.read_csv('new_data.csv')
existing = pd.read_csv('existing.csv')
combined = pd.concat([existing, new_data], ignore_index=True)
combined.to_csv('combined.csv', index=False) # 覆盖写入
追加Excel工作表:
with pd.ExcelWriter('output.xlsx', mode='a', if_sheet_exists='overlay') as writer:
new_data.to_excel(writer, sheet_name='Sheet1', startrow=writer.sheets['Sheet1'].max_row, index=False)
推荐:用sqlite3或数据库进行追加,避免大文件反复读写。
掌握Pandas数据追加是数据清洗、日志合并和增量更新的基础,从理解append到熟练使用pd.concat,再到性能优化,每一步都能极大提升你的数据处理效率。弃用旧方法,拥抱concat,并在循环中使用列表积累策略,你的代码将更稳健、更高效。