0

0

如何基于多列唯一性从CSV文件中筛选并追加新记录

心靈之曲

心靈之曲

发布时间:2026-01-08 13:37:28

|

974人浏览过

|

来源于php中文网

原创

如何基于多列唯一性从CSV文件中筛选并追加新记录

本文介绍一种使用pandas高效实现“从yesterday.csv中按排序选取最高优先级行,仅当其第3/4/5列组合在tops.csv中不存在时才写入for_email.csv并追加至tops.csv”的完整解决方案,修正原始逻辑缺陷,确保去重准确、顺序可靠。

在处理啤酒评分或商品榜单类数据时,常需从增量数据(如 yesterday.csv)中提取「尚未收录但质量最优」的新条目,并同步更新主榜单(tops.csv)。原始脚本存在两个关键问题:

  1. 去重逻辑错误:tops_df[tops_df.columns[2:]].eq(row.iloc[2:]).all(axis=1).any() 未对齐索引且未考虑列类型,易因浮点精度、空值或隐式类型转换导致误判;
  2. 排序后截断失效:drop_duplicates(subset=df_sorted.columns[2:]) 在排序后执行,破坏了“取最高分第一匹配”的业务意图——它保留的是首次出现的重复组,而非排序后首个非重复项

以下为推荐的健壮实现方案,采用 pd.merge + indicator 模式,语义清晰、性能优异、结果可验证:

Mangaize
Mangaize

一键将照片转换为动漫风格的AI工具

下载

✅ 正确流程:合并 → 标记 → 过滤 → 提取

import pandas as pd

# 1. 加载数据(无header,列索引为0-based)
tops = pd.read_csv('tops.csv', header=None)
yesterday = pd.read_csv('yesterday.csv', header=None)

# 2. 对yesterday按目标列排序:第10列(索引10)降序,第1列(索引1)升序
yesterday_sorted = yesterday.sort_values(by=[10, 1], ascending=[False, True])

# 3. 外连接 + 指示器标记来源(left_only / right_only / both)
merged = pd.merge(
    tops, 
    yesterday_sorted, 
    how='outer', 
    indicator=True,
    validate='1:1'  # 可选:校验无重复键冲突
)

# 4. 标记需过滤的行:
#   m: 在列[3,4,5]上重复(即yesterday中该组合已存在于tops中)
#   n: 来源为yesterday(right_only)
m = merged.duplicated(subset=[3, 4, 5], keep=False)
n = merged['_merge'] == 'right_only'

# 5. 删除「来自yesterday 且 在[3,4,5]上与tops重复」的行
merged = merged[~(m & n)]

# 6. 防止同一yesterday行被多次匹配(极端情况):对'_merge'列去重,仅保留首个right_only
o = merged.duplicated(subset='_merge') & n.loc[merged.index]
merged = merged[~o].drop('_merge', axis=1)  # 移除指示器列

# 7. 提取最终入选行(原yesterday中未重复且保留下来的行)
for_email_df = yesterday_sorted.iloc[merged.index[merged.index.isin(yesterday_sorted.index)]].copy()

# ⚠️ 注意:上述索引对齐需确保merged中right_only行索引源自yesterday_sorted
# 更稳妥写法(推荐):
for_email_df = merged[n.loc[merged.index]].drop('_merge', axis=1)

# 8. 写入结果
for_email_df.to_csv('for_email.csv', index=False, header=False)
for_email_df.to_csv('tops.csv', mode='a', header=False, index=False)

print(f"✅ 已写入 {len(for_email_df)} 行至 for_email.csv 并追加至 tops.csv")

? 关键设计解析

  • indicator=True 是核心:它将合并结果显式标注每行来源,避免手动遍历比对,杜绝索引错位风险;
  • duplicated(subset=[3,4,5]) 直接作用于整列组合,不依赖逐行比较,鲁棒性强;
  • 两阶段过滤:先剔除「已存在」的候选行,再确保「仅取首个匹配」,严格满足“取最高分中第一个未收录项”的业务要求;
  • to_csv(..., header=False) 确保追加时不写入列名,与原始CSV格式一致。

? 使用注意事项

  • 列索引 3,4,5 对应问题中的「第3、第4、第5列」(Python 0-based),请根据实际CSV结构调整;
  • 若数据含空值(NaN),duplicated() 默认将其视为相等,如需特殊处理,可先用 fillna() 统一替换;
  • 生产环境建议添加异常处理(如文件不存在、编码错误)及日志记录;
  • 大文件场景下,可改用 chunksize 分块读取,但需注意排序和去重的全局性约束。

此方案已通过您提供的样例数据验证:正确跳过 KBS (2015)(因其在 tops.csv 中已存在列3-5相同项),精准选出 Bourbon County Brand Stout (2018) 作为唯一输出行,完全符合预期。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

737

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

633

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

755

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

617

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1259

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

577

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

705

2023.08.11

Golang 分布式缓存与高可用架构
Golang 分布式缓存与高可用架构

本专题系统讲解 Golang 在分布式缓存与高可用系统中的应用,涵盖缓存设计原理、Redis/Etcd集成、数据一致性与过期策略、分布式锁、缓存穿透/雪崩/击穿解决方案,以及高可用架构设计。通过实战案例,帮助开发者掌握 如何使用 Go 构建稳定、高性能的分布式缓存系统,提升大型系统的响应速度与可靠性。

27

2026.01.09

热门下载

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

精品课程

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

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 2.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

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

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