0

0

使用 Pandas 高效比较与更新 CSV 文件数据:基于共同列实现数据同步

DDD

DDD

发布时间:2025-09-26 13:03:18

|

439人浏览过

|

来源于php中文网

原创

使用 Pandas 高效比较与更新 CSV 文件数据:基于共同列实现数据同步

本教程将指导您如何使用 Pandas 库比较两个 CSV 文件,并根据共同的标识列(如“Supplier Code”)从第二个文件中更新或提取相关数据(如“Cost Price”)。我们将重点介绍 pd.merge 函数的巧妙应用,以实现数据的高效同步和输出。

引言:数据合并与更新的常见场景

在数据处理中,我们经常会遇到需要整合来自不同来源的数据集。一个典型的场景是,您可能有一个包含基础信息的文件(例如 one.csv),以及另一个包含最新或补充信息的文件(例如 two.csv)。您的目标是:

  1. 找出在两个文件中都存在的记录,通常通过一个唯一的标识符(如“Supplier Code”)。
  2. 对于这些共同的记录,从更新的文件(two.csv)中获取最新的相关数据(如“Cost Price”)。
  3. 将处理后的结果输出到一个新的文件。

Pandas 库提供了强大且灵活的工具来高效地完成这类任务,特别是其 merge 函数。

准备工作:加载 CSV 文件

首先,我们需要导入 Pandas 库,并加载我们的 CSV 文件。为了演示,我们将使用示例数据来创建 DataFrame。

import pandas as pd

# 模拟 one.csv 的数据
data_one = {
    "Supplier Code": [1, 2, 3],
    "Cost Price": [2.25, 1.25, 3.25]
}
df_one = pd.DataFrame(data_one)

# 模拟 two.csv 的数据
data_two = {
    "Supplier Code": [1, 2, 3, 5],
    "Cost Price": [2.25, 1.75, 3.75, 1.25]
}
df_two = pd.DataFrame(data_two)

print("df_one (原始数据):")
print(df_one)
print("\ndf_two (更新数据):")
print(df_two)

输出的 DataFrame 如下:

df_one (原始数据):
   Supplier Code  Cost Price
0              1        2.25
1              2        1.25
2              3        3.25

df_two (更新数据):
   Supplier Code  Cost Price
0              1        2.25
1              2        1.75
2              3        3.75
3              5        1.25

如果您的数据存储在实际的 CSV 文件中,可以使用 pd.read_csv() 函数加载它们:

# 例如:
# df_one = pd.read_csv('one.csv')
# df_two = pd.read_csv('two.csv')

核心操作:使用 pd.merge 进行数据更新

我们的目标是找到 df_one 中存在的“Supplier Code”,并用 df_two 中对应的“Cost Price”来更新它们。pd.merge 函数是实现这一目标的关键。

pd.merge 允许我们根据一个或多个键将两个 DataFrame 组合起来。在这里,我们的合并键是“Supplier Code”。为了确保结果只包含 df_one 中原有的供应商代码,并且获取 df_two 中对应的“Cost Price”,我们可以巧妙地使用 df_one[["Supplier Code"]] 作为左侧的 DataFrame 进行合并。

# 合并两个 DataFrame
# 左侧只选择 df_one 的 'Supplier Code' 列
# 右侧是 df_two 的所有列
# 合并键是 'Supplier Code'
df_merged = pd.merge(df_one[["Supplier Code"]], df_two, on="Supplier Code")

print("\n合并后的结果:")
print(df_merged)

合并后的结果如下:

合并后的结果:
   Supplier Code  Cost Price
0              1        2.25
1              2        1.75
2              3        3.75

解释:

  • df_one[["Supplier Code"]]: 我们只从 df_one 中选取了“Supplier Code”这一列。这形成了一个只包含供应商代码的 DataFrame。
  • df_two: 这是包含更新价格信息的完整 DataFrame。
  • on="Supplier Code": 这指定了两个 DataFrame 应该根据“Supplier Code”列进行匹配。
  • 默认情况下,pd.merge 执行的是内连接(how='inner'),这意味着只有在两个 DataFrame 的“Supplier Code”列中都存在的行才会被包含在结果中。
  • 由于我们左侧只提供了“Supplier Code”,而右侧提供了完整的 df_two,因此对于匹配的供应商代码,Cost Price 将从 df_two 中获取。df_one 中原始的 Cost Price 不会被考虑。

理解与对比:isin 方法的局限性

在原始问题中,用户曾尝试使用 isin 方法:

# present_in_two = one[one['Supplier Code'].isin(two['Supplier Code'])]

这种方法会找出 df_one 中“Supplier Code”存在于 df_two 的所有行。然而,它仅仅是过滤了 df_one,而没有从 df_two 中提取更新的“Cost Price”。因此,它无法满足“Cost Price updated from TWO.csv”的需求。pd.merge 才是实现数据更新和同步的正确方法。

Cursor
Cursor

一个新的IDE,使用AI来帮助您重构、理解、调试和编写代码。

下载

结果输出:保存到新的 CSV 文件

完成数据处理后,您可能需要将结果保存到一个新的 CSV 文件中。可以使用 df.to_csv() 方法:

output_file_path = 'updated_prices.csv'
df_merged.to_csv(output_file_path, index=False)

print(f"\n结果已保存到 {output_file_path}")

index=False 参数用于防止 Pandas 将 DataFrame 的索引写入到 CSV 文件中,这通常是期望的行为。

注意事项与最佳实践

  1. 合并类型 (how 参数): pd.merge 提供了多种合并类型,通过 how 参数控制:

    • 'inner' (默认): 只保留两个 DataFrame 中都存在的键。
    • 'left': 保留左侧 DataFrame 的所有键,并匹配右侧的键;右侧没有匹配的键则填充 NaN。
    • 'right': 保留右侧 DataFrame 的所有键,并匹配左侧的键;左侧没有匹配的键则填充 NaN。
    • 'outer': 保留两个 DataFrame 的所有键,没有匹配的则填充 NaN。 根据您的具体需求选择合适的合并类型。在本教程的场景中,inner 是最合适的。
  2. 列名冲突 (suffixes 参数): 如果除了合并键之外,两个 DataFrame 中还有其他同名列,Pandas 在合并时会自动添加 _x 和 _y 后缀来区分它们。您可以通过 suffixes 参数自定义这些后缀,例如 pd.merge(df1, df2, on='key', suffixes=('_left', '_right'))。

  3. 数据类型一致性: 确保用于合并的键列(例如“Supplier Code”)在两个 DataFrame 中的数据类型是一致的。不一致的数据类型可能导致合并失败或结果不正确。可以使用 df['column'].astype(str) 或 df['column'].astype(int) 进行类型转换。

  4. 性能考量: 对于包含数百万甚至数十亿行数据的超大型文件,虽然 Pandas merge 通常效率很高,但内存消耗可能成为问题。在这种情况下,可以考虑分块处理(chunksize 参数在 pd.read_csv 中)或使用 Dask 等专门处理大数据集的库。

  5. 缺失值处理: 合并操作可能导致结果中出现 NaN(Not a Number)值,尤其是在使用 left, right 或 outer 合并时。您可能需要使用 df.fillna() 填充缺失值,或使用 df.dropna() 删除包含缺失值的行。

总结

通过本教程,您已经学会了如何使用 Pandas 的 pd.merge 函数高效地比较两个 CSV 文件,并根据共同的标识列从一个文件更新另一个文件的特定数据。这种方法在数据同步、报告生成和数据清洗等多种场景中都非常实用。掌握 pd.merge 及其各种参数,将大大提升您的数据处理能力。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

69

2025.12.04

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

310

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

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

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

183

2023.12.04

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

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

289

2024.02.23

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

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

259

2025.06.11

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

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

125

2025.08.07

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

483

2023.08.02

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 5万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.1万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

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

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