
本教程将指导您如何使用 Pandas 库比较两个 CSV 文件,并根据共同的标识列(如“Supplier Code”)从第二个文件中更新或提取相关数据(如“Cost Price”)。我们将重点介绍 pd.merge 函数的巧妙应用,以实现数据的高效同步和输出。
引言:数据合并与更新的常见场景
在数据处理中,我们经常会遇到需要整合来自不同来源的数据集。一个典型的场景是,您可能有一个包含基础信息的文件(例如 one.csv),以及另一个包含最新或补充信息的文件(例如 two.csv)。您的目标是:
找出在两个文件中都存在的记录,通常通过一个唯一的标识符(如“Supplier Code”)。对于这些共同的记录,从更新的文件(two.csv)中获取最新的相关数据(如“Cost Price”)。将处理后的结果输出到一个新的文件。
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 Price0 1 2.251 2 1.252 3 3.25df_two (更新数据): Supplier Code Cost Price0 1 2.251 2 1.752 3 3.753 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 Price0 1 2.251 2 1.752 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 才是实现数据更新和同步的正确方法。
结果输出:保存到新的 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 文件中,这通常是期望的行为。
注意事项与最佳实践
合并类型 (how 参数): pd.merge 提供了多种合并类型,通过 how 参数控制:
‘inner’ (默认): 只保留两个 DataFrame 中都存在的键。’left’: 保留左侧 DataFrame 的所有键,并匹配右侧的键;右侧没有匹配的键则填充 NaN。’right’: 保留右侧 DataFrame 的所有键,并匹配左侧的键;左侧没有匹配的键则填充 NaN。’outer’: 保留两个 DataFrame 的所有键,没有匹配的则填充 NaN。根据您的具体需求选择合适的合并类型。在本教程的场景中,inner 是最合适的。
列名冲突 (suffixes 参数): 如果除了合并键之外,两个 DataFrame 中还有其他同名列,Pandas 在合并时会自动添加 _x 和 _y 后缀来区分它们。您可以通过 suffixes 参数自定义这些后缀,例如 pd.merge(df1, df2, on=’key’, suffixes=(‘_left’, ‘_right’))。
数据类型一致性: 确保用于合并的键列(例如“Supplier Code”)在两个 DataFrame 中的数据类型是一致的。不一致的数据类型可能导致合并失败或结果不正确。可以使用 df[‘column’].astype(str) 或 df[‘column’].astype(int) 进行类型转换。
性能考量: 对于包含数百万甚至数十亿行数据的超大型文件,虽然 Pandas merge 通常效率很高,但内存消耗可能成为问题。在这种情况下,可以考虑分块处理(chunksize 参数在 pd.read_csv 中)或使用 Dask 等专门处理大数据集的库。
缺失值处理: 合并操作可能导致结果中出现 NaN(Not a Number)值,尤其是在使用 left, right 或 outer 合并时。您可能需要使用 df.fillna() 填充缺失值,或使用 df.dropna() 删除包含缺失值的行。
总结
通过本教程,您已经学会了如何使用 Pandas 的 pd.merge 函数高效地比较两个 CSV 文件,并根据共同的标识列从一个文件更新另一个文件的特定数据。这种方法在数据同步、报告生成和数据清洗等多种场景中都非常实用。掌握 pd.merge 及其各种参数,将大大提升您的数据处理能力。
以上就是使用 Pandas 高效比较与更新 CSV 文件数据:基于共同列实现数据同步的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1373817.html
微信扫一扫
支付宝扫一扫