【问题标题】:Removing duplicates between multiple CSV files删除多个 CSV 文件之间的重复项
【发布时间】:2020-08-22 07:20:46
【问题描述】:

我有多个 CSV 文件,每个 CSV 文件中有两列:

  1. 链接(A 列)
  2. 说明(B 列)

我不知道最好的方法是在找到时删除链接和描述的所有重复项,只留下一个,这样就只剩下一个链接和描述的实例。如果我可以一次导入所有 CSV 文件,那将是最好的,一个链接可能会出现在多个 CSV 文件中。链接和描述是否有重复将完全相同。谢谢!

【问题讨论】:

标签: python csv spreadsheet opencsv


【解决方案1】:

这可以通过执行 pd.concat 和 drop_duplicates 来完成。

import pandas as pd

df1 = pd.read_csv('path/to/file1.csv')
df2 = pd.read_csv('path/to/file2.csv')

df = pd.concat([df1, df2]).drop_duplicates().reset_index(drop=True)

请参考stackoverflow回答here了解更多。

【讨论】:

    【解决方案2】:

    您可以使用集合来跟踪您已经看到的行,而不管该行位于哪个文件中。当您遍历每个文件中的每一行时,您可以忽略集合中已经存在的任何行。

    请注意,csv 模块会将每一行作为列表返回,这不是可散列的数据类型。要将行存储在集合中,您必须先将其转换为元组。

    import csv
    
    already_seen_rows = set()
    
    with open('output_file.csv', 'w', newline='') as output_file:
        writer = csv.writer(output_file)
    
        for input_filepath in list_of_input_filepaths:  # os.listdir() might help here
            with open(input_filepath, 'r', newline='') as input_file:
                reader = csv.reader(input_file)
    
                for row in reader:
                    row_tuple = tuple(row)  # Converting to a hashable type so it works with the set
    
                    if row_tuple not in already_seen_rows:
                        writer.writerow(row)
                        already_seen_rows.add(row_tuple)
    

    【讨论】:

      【解决方案3】:

      这可以通过 Pandas 实现,如下所示:

      import pandas as pd
      
      df1 = pd.read_csv("file1.csv")
      df2 = pd.read_csv("file2.csv")
      df = df1.merge(df2, "outer")
      print(df)
      

      如果你有两个文件,“file1.csv”包括:

      和“file2.csv”组成:

      上述代码的输出将是:

          Links               Description
      0  movie1  Pirates of the Caribbean
      1  movie2                 Star Trek
      2  movie3                 Star Wars
      3  movie4                James Bond
      4  movie5                  Iron Man
      5  movie6                 Toy Story
      
      

      如果您愿意,可以将其导出到新的 csv 文件

      df.to_csv("file3.csv", index=False)
      

      您可能想要调查 pd.concat 和 pd.merge 之间的区别。见this link

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多