删除多个CSV文件之间的重复内容

问题描述 投票:0回答:1

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

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

我不知道有什么好办法,当发现一个链接和描述的时候,要把所有重复的链接和描述删除,只留下一个,这样就只剩下一个链接和描述的实例。如果能一次性导入所有的CSV文件最好,有可能一个链接出现在多个CSV文件中。链接和描述是有重复的将是完全一样的。谢谢

python csv spreadsheet opencsv
1个回答
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的回答 此处 来了解更多。


1
投票

你可以使用一个集合来跟踪你已经看到了哪些行,不管该行在哪个文件中。当你循环浏览每个文件中的每一行时,你可以忽略任何已经在集合中的行。

请注意,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)

1
投票

这可以通过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 "包括:

file1.csv

和 "file2.csv "组成:

enter image description here

上述代码的输出将是:

    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 之间的区别。 参见 这个环节

© www.soinside.com 2019 - 2024. All rights reserved.