新闻中心

如何在Python中将DataFrame数据增量写入Excel并避免重复

2025-11-14
浏览次数:
返回列表

如何在Python中将DataFrame数据增量写入Excel并避免重复

本教程详细介绍了如何使用python和pandas库将dataframe数据增量地写入excel文件,同时有效避免重复记录。通过读取现有数据、比较新旧数据并筛选出唯一的新条目,确保只有尚未存在于excel中的数据行被追加,从而实现高效且无冗余的数据管理。

在日常数据处理工作中,我们经常需要将新的数据追加到现有的Excel文件中。然而,一个常见的挑战是如何避免写入重复的记录,特别是当某些列(如“别名”或“ID”)应作为唯一标识符时。直接追加数据可能会导致Excel文件中出现大量冗余信息,降低数据质量和处理效率。

本教程将提供一个结构化的方法,利用 pandas 和 openpyxl 库来解决这个问题。我们将演示如何智能地识别并跳过已存在的数据,只将全新的记录追加到Excel工作表中。

核心概念:数据去重与增量写入

实现增量写入并避免重复的关键在于以下两步:

  1. 读取现有数据: 首先,我们需要将Excel文件中已有的数据读取到Python的DataFrame中。
  2. 比较与筛选: 接着,将待写入的新数据DataFrame与现有数据进行比较,找出那些在现有数据中不存在的唯一新记录。

准备工作

在开始之前,请确保您的Python环境中安装了 pandas 和 openpyxl 库。如果尚未安装,可以使用以下命令进行安装:

pip install pandas openpyxl

逐步实现

我们将通过一个具体的例子来演示如何实现这一功能。假设我们有一个包含“alias”和“fullname”两列的DataFrame,需要将其内容追加到名为 contact.xlsx 的Excel文件的“Sheet1”中,并以“alias”列作为去重依据。

1. 导入必要的库

首先,导入我们将要使用的库:

import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows

2. 定义Excel文件路径和准备新数据

指定目标Excel文件的路径,并创建一个示例DataFrame df1,它代表了我们希望追加到Excel中的新数据。

excelpath = 'contact.xlsx'

# 示例新数据
df1 = pd.DataFrame([
    {"alias": "xyz", "fullname": "abc"},
    {"alias": "def", "fullname": "ghi"},
    {"alias": "uvw", "fullname": "xyz"},
    {"alias": "new1", "fullname": "New User 1"}, # 新增数据
    {"alias": "new2", "fullname": "New User 2"}  # 新增数据
])

3. 加载或初始化现有Excel数据

在进行数据比较之前,我们需要获取Excel文件中已有的数据。这里使用 pd.read_excel。为了处理Excel文件可能不存在的首次运行情况,我们使用 try-except FileNotFoundError 块。如果文件不存在,就创建一个空的DataFrame作为基准。

Perplexity Perplexity

Perplexity是一个ChatGPT和谷歌结合的超级工具,可以让你在浏览互联网时提出问题或获得即时摘要

Perplexity 302 查看详情 Perplexity
try:
    # 尝试读取现有Excel数据到DataFrame
    existing_df = pd.read_excel(excelpath, sheet_name='Sheet1') 
except FileNotFoundError:
    # 如果文件不存在,则创建一个空的DataFrame,列名与待写入数据一致
    existing_df = pd.DataFrame(columns=['alias', 'fullname']) 

说明: sheet_name='Sheet1' 指定了要读取的工作表。如果您的工作表名称不同,请相应修改。

4. 筛选出非重复的新数据

这是实现去重的核心步骤。我们将 df1 中 alias 列的值与 existing_df 中 alias 列的值进行比较,只保留那些在 existing_df 中不存在的行。

# 筛选出df1中'alias'列的值不在existing_df中'alias'列的值的行
new_data = df1[~df1['alias'].isin(existing_df['alias'])]

说明:

  • existing_df['alias'] 获取现有数据中所有别名。
  • df1['alias'].isin(existing_df['alias']) 返回一个布尔Series,指示 df1 中的每个别名是否已存在于 existing_df 中。
  • ~ 是逻辑非运算符,它将上述布尔Series取反,从而选择那些别名存在于 existing_df 中的行。
  • 最终 new_data DataFrame将只包含需要追加的、不重复的记录。

5. 条件性写入Excel

在筛选出 new_data 后,我们检查它是否为空。只有当有新的、不重复的数据需要写入时,才执行Excel写入操作。

if not new_data.empty:
    # 加载工作簿
    wb = load_workbook(excelpath)
    # 选择目标工作表
    ws = wb['Sheet1']

    # 将新的数据行追加到工作表
    # index=False 避免写入DataFrame索引
    # header=False 避免重复写入列标题,因为Excel中通常已有标题
    for r in dataframe_to_rows(new_data, index=False, header=False):
        ws.append(r)

    # 保存工作簿
    wb.s*e(excelpath)
    print("数据已成功追加,并跳过重复项。")
else:
    print("没有新的数据需要追加,所有记录均已存在。")

说明:

  • load_workbook(excelpath) 以读写模式打开Excel文件。
  • wb['Sheet1'] 访问指定的工作表。
  • dataframe_to_rows(new_data, index=False, header=False) 将DataFrame转换为适合 openpyxl 追加的行迭代器。header=False 是非常关键的,它确保在追加数据时不会再次写入列标题。
  • ws.append(r) 将每一行追加到工作表的末尾。
  • wb.s*e(excelpath) 保存对Excel文件的修改。

完整示例代码

将以上所有步骤整合,形成一个完整的脚本:

import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows

excelpath = 'contact.xlsx'

# 示例新数据
df1 = pd.DataFrame([
    {"alias": "xyz", "fullname": "abc"},
    {"alias": "def", "fullname": "ghi"},
    {"alias": "uvw", "fullname": "xyz"},
    {"alias": "new1", "fullname": "New User 1"},
    {"alias": "new2", "fullname": "New User 2"}
])

try:
    # 尝试读取现有Excel数据
    existing_df = pd.read_excel(excelpath, sheet_name='Sheet1') 
    # 确保'alias'列存在,如果不存在则初始化为空列表,防止后续isin操作报错
    if 'alias' not in existing_df.columns:
        existing_df['alias'] = []
except FileNotFoundError:
    # 如果文件不存在,则创建一个空的DataFrame作为基准
    existing_df = pd.DataFrame(columns=['alias', 'fullname']) 

# 筛选出非重复的新数据
# 只有当df1中的'alias'值不在existing_df的'alias'列中时,才保留该行
new_data = df1[~df1['alias'].isin(existing_df['alias'])]

if not new_data.empty:
    # 如果有新的数据需要写入
    wb = load_workbook(excelpath)
    ws = wb['Sheet1']

    # 检查是否需要写入标题行
    # 如果工作表为空(行数为0或只有默认标题),则写入标题
    if ws.max_row == 0 or (ws.max_row == 1 and all(cell.value is None for cell in ws[1])):
        ws.append(list(new_data.columns)) # 写入列标题

    # 将新的数据行追加到工作表,不写入索引和重复标题
    for r in dataframe_to_rows(new_data, index=False, header=False):
        ws.append(r)

    wb.s*e(excelpath)
    print("数据已成功追加,并跳过重复项。")
else:
    print("没有新的数据需要追加,所有记录均已存在。")

注意事项

  1. 唯一标识列的准确性: 确保您选择用于去重的列(例如本例中的“alias”)在逻辑上确实应该是唯一的。如果该列在Excel中可能存在重复,那么去重逻辑将按照该列进行,可能不符合您的预期。
  2. 性能考量: 对于包含数百万行的大型Excel文件,pd.read_excel 可能会消耗较多的内存和时间。在这种情况下,可以考虑使用数据库来存储数据,或者采用更高级的分块读取和处理策略。
  3. 数据类型匹配: 确保DataFrame和Excel中用于比较的列的数据类型一致,以避免因数据类型不匹配导致的比较错误。例如,如果Excel中的“alias”是数字而DataFrame中是字符串,可能会导致 isin 方法无法正确匹配。
  4. 初始文件状态: 在首次运行脚本时,如果 contact.xlsx 文件不存在,脚本会创建一个新的Excel文件,并写入所有数据。后续运行则会进行去重判断。
  5. Excel文件头处理: 在上面的完整代码中,我们增加了一个逻辑来判断工作表是否为空,如果为空则写入标题行。这使得脚本在首次创建文件时也能有正确的表头。

总结

通过本教程,您已经学会了如何使用Python和pandas库实现向Excel文件增量写入数据,并有效避免重复记录。这种方法提高了数据管理的效率和准确性,尤其适用于需要定期更新数据集的场景。掌握这一技巧,将使您在数据自动化处理方面更具优势。

以上就是如何在Python中将DataFrame数据增量写入Excel并避免重复的详细内容,更多请关注其它相关文章!


# 数据管理  # 机场网站建设素材库  # 长安网络营销推广方法  # 大埔县网站建设推广公司  # 英文网站建设作业  # 梧州热门seo方案  # 临洮县关键词seo排名优化  # 南山展示型网站建设费用  # 周口企业营销网站推广  # 360seo实战  # 清溪抖音seo营销  # 布尔  # excel  # 运算符  # 跳过  # 这一  # 首次  # 为空  # 您的  # 创建一个  # 不存在  # app  # python 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 《主播少女的秘密账号迷宫》首支宣传片  Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】  QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口  如何修改开机登录密码_Windows账户安全设置超详细教程【必学】  QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台  C++如何操作大型数据集_使用C++流式处理(Streaming)技术避免一次性加载大文件  J*a最大堆Heapify方法修复:索引计算与边界条件深度解析  Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧  Surface怎么安装系统 微软Surface Pro U盘重装win11教程  解决Bootstrap卡片顶部边距导致背景图下移的问题  ArchiveofOurOwn小说阅读-ArchiveofOurOwn同人作品访问链接  谷歌google账号注册详细步骤 谷歌账号注册官方教程  UC浏览器网页版登录入口官网 电脑版网址入口  迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法  必由学官方网站入口 必由学学生教师共用登录通道  Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求  Lar*el表单中优雅地处理“返回”按钮以规避验证:最佳实践指南  特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相  CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题  “音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!  Win10桌面图标出现小盾牌怎么办 Win10去除UAC图标教程【解决】  12306选座系统怎么选连座_12306选座多人连坐操作方法  cad如何更改注释性对象的比例_cad注释性比例调整方法  Lar*el头像管理:图片缩放与旧文件删除的最佳实践  C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用  邮政快递包裹最新位置 邮政快递实时追踪入口  Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度  最新韩小圈网页版登录入口_官网在线观看官方链接  c++ dfs和bfs代码 c++深度广度优先搜索算法  Win10系统怎么查看已安装更新_Win10卸载有问题的更新补丁  Linux如何构建多环境配置管理_Linux多环境配置方案  Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量  AO3官网镜像链接 Archive of Our Own同人文在线浏览  Excel Power Pivot如何处理XML数据源 构建高级数据模型  J*aScript生成器_j*ascript异步迭代  2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC  C++如何实现异步操作_C++11使用std::future和std::async进行异步编程  C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责  Tabulator表格日期时间排序问题及自定义解决方案  一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰  铁路12306的积分有效期是多久_铁路12306积分有效期说明  汽水音乐车机版横屏版7.1 汽水音乐车机版横屏版下载入口  J*a TimerTask文件监控:HashMap状态管理与常见陷阱规避指南  荣耀Play7T运行卡顿解决_荣耀Play7T性能优化  怎样在Excel中做仪表盘_Excel仪表盘设计与关键指标展示方法  《GTA6》开发画面疑似泄露!这次可不是AI了  yy漫画网页版官方入口_yy漫画官网登录页面链接  漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站  动漫花园资源网使用步骤_动漫花园资源网下载流程  拷贝漫画电脑版官网入口 拷贝漫画(PC版)在线直达 

搜索