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

DDD
发布: 2025-09-26 13:03:18
原创
423人浏览过

使用 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 才是实现数据更新和同步的正确方法。

腾讯智影-AI数字人
腾讯智影-AI数字人

基于AI数字人能力,实现7*24小时AI数字人直播带货,低成本实现直播业务快速增增,全天智能在线直播

腾讯智影-AI数字人 73
查看详情 腾讯智影-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 及其各种参数,将大大提升您的数据处理能力。

以上就是使用 Pandas 高效比较与更新 CSV 文件数据:基于共同列实现数据同步的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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