Pandas:如何比较导入的 csv 文件的列以确保它们相同?

Posted

技术标签:

【中文标题】Pandas:如何比较导入的 csv 文件的列以确保它们相同?【英文标题】:Pandas: how to compare columns of imported csv files to ensure they are the same? 【发布时间】:2017-03-10 10:11:25 【问题描述】:

我将大量数据拆分为 4 个 csv 文件。它们应该具有相同的列,并且每个文件都是前一个文件的延续。 我在 Pandas 中导入 4 个 CSV 文件,在合并它们之前,我想比较所有 4 个列以找出任何差异。

    如何使用 Pandas/Python 做到这一点? 我使用合并还是追加? csv1 涵盖 2001 年到 2004 年,csv2 涵盖 2005 年到 2007 年等等,只是按时间划分。

【问题讨论】:

你应该把你试过的东西。你所说的不同是什么意思......请更新你的问题。 您的 csv 文件是否包含列名?如果是,您知道应该出现的正确列名吗? 是的 csv 文件包含列名,我希望所有文件(从 csv2 开始)都具有与第一个文件 (csv1) 相同的列 想法是检查所有文件中的所有列名是否相同 【参考方案1】:

如果事先知道列名,您可以通过usecols 参数将它们显式传递给pd.read_csv。如果您的 csv 文件和预定义的列名之间的列名不匹配,将自动引发 ValueError

要合并您的 csv 文件,您可以使用 pd.concat:

# define your column names
column_names = ["Col A", "Col B", "Col C", "Col D"]

# setup file paths
base_path = os.path.join("E:/","Datasets","Dataset01") # adopted your example here
file_names = ["file1.csv", "file2.csv", "file3.csv", "file4.csv"]
abs_paths = [os.path.join(base_path, file_name)
             for file_name in file_names]

dfs = pd.concat([pd.read_csv(abs_path, usecols=columns_names) 
                 for abs_path in abs_paths])

如果您想检查 csv 文件中的所有列是否相同,您可以在使用 nrows=0 时仅加载 csv 文件的标题:

cols = [pd.read_csv(abs_path, nrows=0).columns
        for abs_path in abs_paths]

cols_identical = [all(cols[0] == colx) for colx in cols[1:]]
all_cols_same = all(cols_identical) 

【讨论】:

谢谢,使用 os.path.join 会是什么样子,我通常将import pandas from os import path df1 = pandas.read_csv(path.join("E:/","Datasets","Dataset01","csv1.csv"), error_bad_lines=False) 用于一个文件。对于所有四个 csv 文件,如何在您的代码中获取 os.path.join? @MCGCode 修改了答案。【参考方案2】:

假设你有 df1,df2 与 csv1,csv2 相关

1. all(df1.columns == df2.columns)
2. pd.concat([df1, df2]) 

详情请查看concat。

【讨论】:

谢谢。如何一次处理所有文件?我现在有 4 个文件,但有些数据集有多个文件。 我的意思是如何一次比较所有文件的列 你的意思是要检查一个像 f(df_columns) 这样的函数,而 df_columns 是 dataframe.columns 的一个列表吗?我一下子有点困惑,如你所知,你需要与 N 个文件进行至少 N 次比较 :) 我给你一个我想到的逻辑示例,它在代码中并不正确,但它是这样的:df1.columns == df2.columns == df3.columns == df4。列或某个循环。我不知道。只是我需要一个可以比较所有文件的代码,我不需要比较每两个文件并移动到下一个文件,依此类推。 对于你提到的算法“不应该需要比较每个两个文件并移动到下一个2等等”,如果file1的列== file2,file3==file4,它可能会失败,但是文件 1 != 文件 3。我的意思是你必须为 N 个文件至少比较 N 次,无论是比较每个两个文件还是将文件与一个通用标准比较。

以上是关于Pandas:如何比较导入的 csv 文件的列以确保它们相同?的主要内容,如果未能解决你的问题,请参考以下文章

Python:将列表写入 Pandas 中的列

pandas read_csv 修复列以读取数据中带有换行符的数据

将 CSV 文件导入为 pandas DataFrame

如何迭代熊猫数据框的列以运行回归

将两个 csv 文件与 python pandas 进行比较

如何从导入的 csv 文件中索引日期时间列 - pandas