Python案例如何用Pandas做数据追加

wen python案例 1

Python案例:如何用Pandas做数据追加——从基础到实战的完整指南

目录导读

  1. Pandas数据追加的核心概念
    • 什么是数据追加(Append)?
    • 追加与合并(Merge/Join)的区别
  2. 使用append()方法的6个实战案例
    • 案例1:DataFrame追加单行数据
    • 案例2:DataFrame追加多行数据(从列表)
    • 案例3:追加另一个DataFrame(列对齐)
    • 案例4:列名不匹配时的处理与警告
    • 案例5:忽略索引重置(ignore_index=True
    • 案例6:高效追加大数据集(使用pd.concat
  3. 使用pd.concat()进行复杂追加
    • 垂直追加(axis=0)与水平追加(axis=1
    • 处理索引重复与标签对齐
  4. 常见错误与性能优化
    • 避免append在循环中的性能陷阱
    • 使用list积累后再追加的高效方案
  5. 问答环节(FAQ)
    • Q1:append被弃用了?现在该用什么替代?
    • Q2:追加后为什么会有NaN?如何避免?
    • Q3:如何追加CSV或Excel文件中的新数据?

Pandas数据追加的核心概念

什么是数据追加(Append)?

在数据分析中,“追加”指将新数据行添加到现有DataFrame或Series的末尾,类似于在Excel表格底部粘贴新行,Pandas提供两种主要方法:DataFrame.append()(旧版本常用,2.0后不建议)和pd.concat()(推荐方法)。

Python案例如何用Pandas做数据追加

追加与合并(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?如何避免?

常见原因

  1. 追加的DataFrame列名与原表不完全一致。
  2. 索引对齐时缺失值(水平追加常见)。
    避免方法
  • 确保列名统一,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,并在循环中使用列表积累策略,你的代码将更稳健、更高效。

抱歉,评论功能暂时关闭!