【问题标题】:How to compare two columns in two CSV's using dictionary?如何使用字典比较两个 CSV 中的两列?
【发布时间】:2021-05-24 11:57:53
【问题描述】:

我有两个大的 csv 文件,我想比较 csv1 中的 column1 和 csv2 中的 column1。我可以使用 Python List 来执行此操作,其中我读取了 csv1 并将 column1 放入 list1,对 csv2 执行相同的操作,然后检查 list1 中的元素是否存在于 list2 中

olist = []
def oldList(self):
    for row in self.csvreaderOld:
        self.olist.append(row[1])

nlist = []
def newList(self):
    for row in self.csvreaderNew:
        self.nlist.append(row[1])

def new_list(self):
    return [item for item in self.olist if item not in self.nlist]

代码有效,但可能需要很长时间才能完成。我正在尝试查看是否可以改用字典,看看是否会更快,所以我可以比较字典2中存在的字典1中的键,但由于我的知识有限,到目前为止还没有成功。

【问题讨论】:

    标签: python python-3.x pandas dictionary


    【解决方案1】:

    如果它是一个很大的 CSV 文件,或者您打算继续使用表格,我建议使用 Pandas 模块。

    说实话,即使它是一个小文件,或者您不会继续使用表格,Pandas 也是一个优秀 模块。

    据我了解(我可能弄错了),对于读取 CSV 文件,Pandas 是最快的库之一。

    import pandas as pd
    
    df = pd.read_csv("path to your csv file", columns = ["column1", "column2"])
    
    def new_list(df):
        return [item for item in df["column2"].values if item not in df["column1"].values]
    

    在检查 pandas 系列中的项目时使用 .values 很重要(当您在 DataFrame 中提取列时,您将得到一个 pandas 系列)

    您还可以使用list(df["column1"])How to determine whether a Pandas Column contains a particular value 中建议的其他方法来确定值是否包含在pandas 列中

    例如:

    df = pd.DataFrame({"column1":[1,2,3,4], "column2":[2,3,4,5]})
    

    数据框将是

    column1   column2
    1   2
    2   3
    3   4
    4   5
    

    new_line 将返回[5]

    【讨论】:

    • 嗨@'Guy vandam',根据问题要求,您必须阅读这两个文件。
    • 嘿@ItzikChaimov,你说得对,我对列和文件编号感到困惑。这是一个类似的答案,您可以读取 2 个数据帧 df1 和 df2 并从每个数据帧中获取 column1。此外,从 pandas 中的 csv 读取时,您应该使用 usecols= 而不是 columns=。我的坏..
    【解决方案2】:

    您可以将这两个文件读入对象并在一个循环中进行比较。 这是该想法的简短代码sn-p(不是类实现):

    fsOld = open('oldFile.csv', 'r')
    fsNew = open('newFile.csv', 'r')
    fsLinesOld = fsOld.readlines()
    fsLinesNew = fsNew.readlines()
    outList = []
    
    # assumes lines are same for both files data:
    for i in range(0, fsLinesOld.__len__(), 1):
        if ( fsLinesOld[i] == fsLinesNew[i]):
            outList.append(fsLinesOld[i])
    

    【讨论】:

      【解决方案3】:

      首先,改变读取CSV文件的方式,如果你只想在usecols中提到一列,像这样

      df = pd.read_csv("sample_file.csv", usecols=col_list)
      

      其次,如果你不是逐行比较,你可以使用设置差异,像这样

      set(df.col.to_list()).difference(set(df2.col.to_list()))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-21
        • 2020-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-22
        • 1970-01-01
        相关资源
        最近更新 更多