0

0

Pandas数据处理:高效添加新行、去重与ID序列维护最佳实践

心靈之曲

心靈之曲

发布时间:2025-11-09 13:13:01

|

939人浏览过

|

来源于php中文网

原创

Pandas数据处理:高效添加新行、去重与ID序列维护最佳实践

本教程旨在解决使用pandas向csv文件或dataframe添加新数据时,如何高效去重并正确维护自增id序列的问题。通过介绍一种优化的pandas方法,我们将展示如何利用`pd.concat`和`drop_duplicates`进行批量操作,并重新生成id列,从而避免常见的`nan`值和性能问题,确保数据完整性和一致性。

在数据管理和更新的场景中,我们经常需要向现有数据集添加新的记录。一个常见的需求是确保新添加的记录不会与现有记录重复,并且如果数据集中包含一个自增的唯一标识符(如ID列),这个ID序列在更新后也需要保持其连续性和正确性。

低效与潜在问题的方法分析

假设我们有一个包含Id和Name两列的CSV文件,其中Id是一个从0开始的自增序列。

原始数据示例 (original.csv):

Id Name
0 Alpha
1 Beta
2 Gamma
3 Delta

我们希望添加一个新列表中的项目,例如 items = ["Epsilon", "Beta", "Zeta"],并去除重复项(基于Name列),最终得到一个去重且ID序列连续的数据集。

一种常见的、但效率低下且容易出错的尝试是使用循环结合df.append()和df.drop_duplicates():

Favird No-Code Tools
Favird No-Code Tools

无代码工具的聚合器

下载
import pandas as pd

# 模拟原始DataFrame
data = {'Id': [0, 1, 2, 3], 'Name': ['Alpha', 'Beta', 'Gamma', 'Delta']}
df = pd.DataFrame(data)

items = ["Epsilon", "Beta", "Zeta"]

# 尝试的低效方法
# for i in range(len(items)):
#     # 注意:df.append() 在 Pandas 2.0 后已弃用,推荐使用 pd.concat
#     df = df.append({'Id': len(df), 'Name': items[i]}, ignore_index=True)
# df = df.drop_duplicates(['Name'], ignore_index=True)
# print(df)

这种方法存在几个问题:

  1. df.append() 的效率问题: 在循环中反复使用append会创建新的DataFrame对象,导致性能低下,尤其是在处理大量数据时。Pandas官方已推荐使用pd.concat()代替append()。
  2. ID列的维护问题: 尽管在append时尝试手动设置Id,但在drop_duplicates操作后,DataFrame的行数和顺序会发生变化,导致原有的Id序列不再连续,甚至可能出现NaN值(如果原始Id是索引且没有正确处理)。drop_duplicates本身不会重新生成或调整ID列。

高效解决方案:Pandas优化实践

为了高效地实现添加新行、去重并维护ID序列,我们应该采用Pandas的向量化操作。核心思路是:将新数据构建为DataFrame,与现有数据进行合并,然后对合并后的数据进行去重,最后重新生成ID序列。

核心步骤

  1. 将新数据转换为DataFrame: 将待添加的列表转换为一个临时的Pandas DataFrame。
  2. 合并现有与新数据: 使用pd.concat()将原始DataFrame与新数据的DataFrame垂直合并。
  3. 执行去重操作: 对合并后的DataFrame使用drop_duplicates()方法,指定去重依据的列(例如Name列)。
  4. 重新生成ID序列: 在去重操作完成后,DataFrame的行数可能已经改变,此时重新生成Id列,确保其从0开始且连续。

示例代码

import pandas as pd

# 1. 模拟原始DataFrame (从CSV读取的场景)
# df = pd.read_csv('original.csv')
data = {'Id': [0, 1, 2, 3], 'Name': ['Alpha', 'Beta', 'Gamma', 'Delta']}
df = pd.DataFrame(data)

# 待添加的新项目列表
items_to_add = ["Epsilon", "Beta", "Zeta"]

# 2. 将新项目转换为DataFrame
new_items_df = pd.DataFrame({"Name": items_to_add})

# 3. 合并现有DataFrame与新数据,并进行去重
# pd.concat() 默认是按行合并 (axis=0)
# drop_duplicates(subset="Name") 会基于Name列去重,默认保留第一次出现的行
df_combined = pd.concat([df, new_items_df], ignore_index=True)
df_deduplicated = df_combined.drop_duplicates(subset="Name", keep='first')

# 4. 重新生成Id列,确保其连续性
# 使用 range(len(df_deduplicated)) 为每一行生成一个从0开始的连续ID
df_deduplicated["Id"] = range(len(df_deduplicated))

# 打印最终结果
print("最终去重并更新ID后的DataFrame:")
print(df_deduplicated)

# 如果需要,可以将结果保存回CSV文件
# df_deduplicated.to_csv('output.csv', index=False)

输出结果:

最终去重并更新ID后的DataFrame:
   Id     Name
0   0    Alpha
1   1     Beta
2   2    Gamma
3   3    Delta
4   4  Epsilon
5   5     Zeta

代码解析

  • new_items_df = pd.DataFrame({"Name": items_to_add}): 这一步将Python列表items_to_add转换为一个只包含Name列的Pandas DataFrame。这是为了与原始df的结构兼容,方便后续的concat操作。
  • df_combined = pd.concat([df, new_items_df], ignore_index=True):
    • pd.concat()函数用于将多个DataFrame沿着某个轴进行连接。在这里,我们提供了两个DataFrame的列表[df, new_items_df]。
    • ignore_index=True参数至关重要,它会在合并后重新生成一个默认的整数索引,避免了原始索引的混淆。
  • df_deduplicated = df_combined.drop_duplicates(subset="Name", keep='first'):
    • drop_duplicates()方法用于删除DataFrame中的重复行。
    • subset="Name"指定了去重操作只考虑Name列的值。这意味着如果两行的Name值相同,则认为它们是重复的。
    • keep='first'(默认值)表示在遇到重复项时,保留第一次出现的行,删除后续出现的重复行。你也可以设置为'last'(保留最后一次出现的)或False(删除所有重复项)。
  • df_deduplicated["Id"] = range(len(df_deduplicated)):
    • 这是确保ID序列正确和连续的关键一步。在去重操作之后,DataFrame的行数可能已经减少。
    • len(df_deduplicated)获取去重后DataFrame的实际行数。
    • range(len(df_deduplicated))生成一个从0到行数-1的整数序列。
    • 将这个序列直接赋值给"Id"列,就实现了ID的重新编号,确保了其连续性和唯一性。

注意事项与最佳实践

  1. 性能优化: 始终优先使用Pandas的内置函数和向量化操作(如pd.concat, drop_duplicates)而非Python循环,以获得最佳性能。
  2. ID列处理时机: 务必在所有添加和去重操作完成后,再统一重新生成ID列。如果在中间步骤尝试维护ID,很容易导致ID不连续或出现错误。
  3. 去重策略: 根据实际业务需求选择合适的subset和keep参数。例如,如果需要基于多列去重,subset可以是一个列名列表,如subset=["Name", "Category"]。
  4. 数据持久化: 完成数据处理后,如果需要将结果保存到文件,请使用df.to_csv('output.csv', index=False)。index=False可以避免将DataFrame的索引作为一列写入CSV文件。
  5. 处理空数据: 在实际应用中,考虑items_to_add列表为空或原始DataFrame为空的边缘情况。上述代码在这种情况下也能正常工作,但了解其行为很重要。

总结

通过本教程,我们学习了如何使用Pandas高效、准确地向DataFrame添加新行,同时进行去重并维护ID列的连续性。关键在于利用pd.concat()进行数据合并,drop_duplicates()进行去重,并在所有数据操作完成后,通过df["Id"] = range(len(df))重新生成ID序列。这种方法不仅解决了常见的ID列问题,也大大提升了数据处理的效率和代码的健壮性。掌握这些Pandas技巧对于任何数据分析和数据管理任务都至关重要。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

79

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

32

2026.01.31

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

210

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

322

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

292

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

178

2025.08.07

append用法
append用法

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

349

2023.10.25

python中append的用法
python中append的用法

在Python中,append()是列表对象的一个方法,用于向列表末尾添加一个元素。想了解更多append的更多内容,可以阅读本专题下面的文章。

1080

2023.11.14

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号