
在数据处理中,我们经常会遇到需要整合来自不同来源的数据集。一个典型的场景是,您可能有一个包含基础信息的文件(例如 one.csv),以及另一个包含最新或补充信息的文件(例如 two.csv)。您的目标是:
Pandas 库提供了强大且灵活的工具来高效地完成这类任务,特别是其 merge 函数。
首先,我们需要导入 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')我们的目标是找到 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
解释:
在原始问题中,用户曾尝试使用 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 文件中。可以使用 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 参数控制:
列名冲突 (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 文件数据:基于共同列实现数据同步的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号