新闻中心
Pandas 数据去重与ID序列化:高效向 DataFrame 添加新行

本教程详细介绍了如何使用 Pandas 高效地向现有 DataFrame 添加新数据,同时自动识别并移除重复项,并确保序列化的 ID 列能够正确更新。文章通过 `pd.concat` 和 `drop_duplicates` 的组合应用,展示了一种简洁且性能优越的数据处理方法,避免了传统迭代方式可能导致的索引和性能问题,确保数据完整性和一致性。
在数据处理和分析中,我们经常需要向现有数据集(通常以 Pandas DataFrame 的形式存在)添加新的记录。一个常见的挑战是,在添加新数据时,需要确保新记录不会与现有记录重复,并且如果数据中包含一个序列化的 ID 列,该列在添加新数据后仍能保持其连续性和正确性。本教程将介绍一种使用 Pandas 高效解决此问题的方法。
问题分析与传统方法局限
假设我们有一个包含 Id 和 Name 列的 DataFrame,其中 Id 是一个从0开始递增的唯一标识符。我们希望添加一个新项列表,但要排除那些 Name 值已经存在于 DataFrame 中的项,并在添加后重新生成连续的 Id。
传统上,一些用户可能会尝试通过迭代新项列表,并使用 df.append()(或其在 Pandas 2.0+ 中的替代方法 pd.concat([df, new_row_df]))逐行添加,然后再调用 df.drop_duplicates()。然而,这种方法存在几个问题:
- 性能问题: 逐行追加操作在处理大量数据时效率低下,因为它可能导致 DataFrame 的频繁重构。
- 索引管理: append() 或 pd.concat() 默认会保留原始索引,这可能导致在去重或重新排序后,索引变得不连续或重复。
- ID 列的复杂性: 如果在去重前尝试分配新的 Id,去重后可能导致 Id 不连续或存在跳跃。如果在去重后分配,则需要一种有效的方式来重新生成整个 Id 列。
高效解决方案:合并、去重与重置ID
Pandas 提供了一种更优雅、更高效的方法来处理这类场景,即结合使用 pd.concat() 进行数据合并,drop_duplicates() 进行去重,以及在去重后统一重置 Id 列。
1. 准备示例数据
首先,我们创建一个初始的 DataFrame 和要添加的新项列表。
import pandas as pd
# 初始 DataFrame
data = {'Id': [0, 1, 2, 3],
'Name': ['Alpha', 'Beta', 'Gamma', 'Delta']}
df_original = pd.DataFrame(data)
print("原始 DataFrame:")
print(df_original)
# 待添加的新项列表
items_to_add = ["Epsilon", "Beta", "Zeta"]
print("\n待添加的新项:", items_to_add)输出:
原始 DataFrame: Id Name 0 0 Alpha 1 1 Beta 2 2 Gamma 3 3 Delta 待添加的新项: ['Epsilon', 'Beta', 'Zeta']
2. 将新项转换为 DataFrame
为了使用 pd.concat(),我们需要将 items_to_add 列表转换为一个 DataFrame。
Perplexity
Perplexity是一个ChatGPT和谷歌结合的超级工具,可以让你在浏览互联网时提出问题或获得即时摘要
302
查看详情
df_new_items = pd.DataFrame({"Name": items_to_add})
print("\n新项 DataFrame:")
print(df_new_items)输出:
新项 DataFrame:
Name
0 Epsilon
1 Beta
2 Zeta3. 合并 DataFrame 并去重
现在,我们将原始 DataFrame 和新项 DataFrame 合并,然后基于 Name 列进行去重。drop_duplicates(subset="Name") 将会检查 Name 列,并默认保留每个重复项的第一个出现。
# 合并原始 DataFrame 和新项 DataFrame
# 注意:这里不需要对df_new_items使用ignore_index=True,因为后续会重新设置Id列
df_combined = pd.concat([df_original, df_new_items])
# 基于 'Name' 列去重,保留第一次出现的记录
df_final = df_combined.drop_duplicates(subset="Name", keep='first')
print("\n合并并去重后的 DataFrame (Id尚未重置):")
print(df_final)输出:
合并并去重后的 DataFrame (Id尚未重置): Id Name 0 0 Alpha 1 1 Beta 2 2 Gamma 3 3 Delta 0 NaN Epsilon 2 NaN Zeta
解释: 可以看到,Beta 因为在 df_original 中已经存在,所以被去重了。Epsilon 和 Zeta 是新添加的,它们在合并后的 df_combined 中被保留。但由于 df_new_items 中没有 Id 列,pd.concat 会自动填充 NaN。这正是我们下一步需要解决的问题。
4. 重置 Id 列
最后一步是为去重后的 DataFrame 重新生成一个连续的 Id 列。我们可以通过 range(len(df_final)) 来实现。
df_final["Id"] = range(len(df_final))
print("\n最终结果 DataFrame (Id已重置):")
print(df_final)输出:
最终结果 DataFrame (Id已重置): Id Name 0 0 Alpha 1 1 Beta 2 2 Gamma 3 3 Delta 4 4 Epsilon 5 5 Zeta
现在,Id 列已经正确地从0开始连续递增,并且所有重复的 Name 都已被移除。
完整代码示例
import pandas as pd
# 1. 初始 DataFrame
data = {'Id': [0, 1, 2, 3],
'Name': ['Alpha', 'Beta', 'Gamma', 'Delta']}
df_original = pd.DataFrame(data)
print("原始 DataFrame:")
print(df_original)
# 2. 待添加的新项列表
items_to_add = ["Epsilon", "Beta", "Zeta"]
print("\n待添加的新项:", items_to_add)
# 3. 将新项转换为 DataFrame
df_new_items = pd.DataFrame({"Name": items_to_add})
# 4. 合并原始 DataFrame 和新项 DataFrame
df_combined = pd.concat([df_original, df_new_items])
# 5. 基于 'Name' 列去重,保留第一次出现的记录
df_final = df_combined.drop_duplicates(subset="Name", keep='first')
# 6. 重置 Id 列,确保其从0开始连续递增
df_final["Id"] = range(len(df_final))
print("\n最终处理结果:")
print(df_final)
# 如果需要保存到 CSV 文件
# df_final.to_csv('output.csv', index=False)注意事项与最佳实践
-
keep 参数: drop_duplicates() 方法中的 keep 参数非常重要。
- keep='first' (默认值):保留第一次出现的重复项。
- keep='last':保留最后一次出现的重复项。
- keep=False:删除所有重复项(即如果一个值出现多次,所有这些行都会被删除)。根据具体需求选择。在本教程中,我们希望保留原始数据中的项,因此 keep='first' 是合适的。
- 性能: 使用 pd.concat() 结合 drop_duplicates() 是处理这类批量数据操作的高效方法,远优于循环逐行添加。
-
索引: 在 pd.concat() 之后,DataFrame 的索引可能会变得混乱(例如,新添加行的索引可能从0开始重复)。但由于我们最终会重新设置 Id 列,并且 Id 列是我们的主要标识符,原始索引的混乱通常不是问题。如果需要一个干净的、从0开始的 Panda
s 内部索引,可以在 df_final["Id"] = range(len(df_final)) 之后再调用 df_final = df_final.reset_index(drop=True)。 - 数据类型: 确保 Name 列的数据类型一致,以便 drop_duplicates() 正确工作。
总结
通过结合使用 pd.concat() 进行高效的数据合并,drop_duplicates(subset="Name") 进行基于特定列的去重,以及 df["Id"] = range(len(df)) 进行 ID 列的重新序列化,我们可以优雅且高效地解决向 DataFrame 添加去重数据并维护连续 ID 的问题。这种方法不仅代码简洁,而且在处理大规模数据集时表现出卓越的性能。
以上就是Pandas 数据去重与ID序列化:高效向 DataFrame 添加新行的详细内容,更多请关注其它相关文章!
# 移除
# 短剧推广授权网站有哪些
# 邹城推广营销策划公司
# 生物网站推广的效果
# seo首页内链作用
# 关键词排名倾向
# 黄页网站建设费用多少
# 抖音营销推广在哪做的呢
# 郴州家装网站建设素材
# 鹤壁做网站推广
# 东港网站的建设
# app
# 如何用
# 数据处理
# 这类
# 我们可以
# 重构
# 转换为
# 是一个
# 序列化
# 自定义
# csv
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
win11专注助手在哪 Win11免打扰模式设置与自动化规则【指南】
J*aScript中localStorage数据的获取、清洗与格式化教程
Win11截图该按哪些键 Win11截屏完整流程解析【教程】
单射、满射与双射的关系 一文理清所有逻辑
jQuery Mask 插件中实现电话号码固定前导零的教程
qq音乐在线播放入口_qq音乐电脑版登录链接
文本文档写html代码怎么运行_文本文档html代码运行步骤【教程】
C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图
Win11怎么开启卓越性能模式 Win11电源选项启用高性能释放硬件潜力【方法】
Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】
期待已久:小米17 Ultra、小米首款NAS本月登场
vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法
Python中高效访问嵌套字典与列表中的键值对
地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站
MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具
qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决
Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】
魅族20怎样在浏览器开无图省流_iPhone魅族20浏览器开无图省流【流量节省】
J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程
mc.js免安装版 mc.js一键畅玩入口
Go语言中的*string:深入理解字符串指针
菜鸟取件码是什么怎么查 最全查询渠道汇总
押井守高度称赞《辐射4》:玩了八年都停不下来!
利用5118提升短视频内容效果_5118短视频关键词优化方法
微博网页版主页入口 微博官方网站免登录访问
Python中高效且防溢出的双曲正弦计算:基于对数空间的优化策略
怎么在mac上运行html代码_mac运行html代码方法【指南】
《燕云十六声》两周内达九百万玩家!位居畅销榜第五
三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】
AO3官方镜像站点汇总 AO3同人作品网页版直达链接
Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧
抖音从哪里进入网页版_抖音官方入口链接
深入理解J*aScript Promise异步执行与微任务队列
VS Code远程开发时如何处理文件权限问题
cad如何更改注释性对象的比例_cad注释性比例调整方法
QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台
Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧
在Typer应用中优雅地处理和重组任意命令行参数
荣耀Play7TPro怎样在信息App置顶客服对话_iPhone荣耀Play7TPro信息App置顶客服对话【优先查看】
Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践
C++如何操作注册表_Windows平台下C++读写注册表的API函数详解
火狐浏览器占用内存高卡顿怎么办 火狐浏览器性能优化设置技巧
圆通快递查询实时追踪 圆通物流包裹状态快速查看
俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达
qq邮箱日历功能怎么用_创建日程与会议邀请的技巧
随机参数递归函数的基准调用次数与时间复杂度探究
Mac怎么使用表情符号_Mac Emoji快捷键面板
必由学官方登录入口 必由学教师学生账号快速访问
Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】
实现全屏滚动与导航点:专业教程


2025-11-13
浏览次数:次
返回列表
s 内部索引,可以在 df_final["Id"] = range(len(df_final)) 之后再调用 df_final = df_final.reset_index(drop=True)。