Удалить дубликаты из файла python csv

#python-3.x

#python-3.x

Вопрос:

У меня есть CSV-файл на python, и имена столбцов — a, b, c, d, f, а данные приведены ниже

                   a,b,c,d,f
                  ab1,ef1,hi1,kl1,Y
                  ab2,ef2,hi2,kl2,N
                  ab3,ef3,hi1,kl3,Y
                  ab4,ef4,hi2,kl4,N
                  ab5,ef5,hi3,kl5,Y
                  ab6,ef6,hi4,kl6,N
  

Сначала я хочу отфильтровать данные, где столбец f равен N, и получить уникальные значения столбца c, а на выходе должны быть только данные столбца c, как показано ниже:

                        hi2
                       hi4
  

Мой код выглядит следующим образом:

           with open(input_txt) as f,open(output_txt, 'w') as outfile:

               reader = csv.DictReader(f, delimiter=',')
               writer = csv.writer(outfile, delimiter = '|')
                for row in reader:
                   my_row = []
                   if row['f'] == "N":
                       my_row.append(row['c'])
                       writer.writerow(my_row)
  

С помощью этого кода я не могу устранить дубликаты и получить приведенный ниже результат.

                                  hi2
                                 hi2
                                 hi4
  

Я пробовал с помощью set и не смог достичь и ценю вашу помощь, если есть какой-либо другой способ устранить дубликаты.

Ответ №1:

Pandas имеет функцию прямого чтения для CSV-файлов. Который вы можете использовать. Кроме того, его также проще выполнить после использования pandas:

 import pandas as pd
df = pd.read_csv('input_file.txt')
df.loc[df.f=='N','c'].unique()
  

Если вы хотите записать это в файл, вы можете сделать следующее:

 import pandas as pd
df = pd.read_csv('input_file.txt')
with open('output_file.txt','w') as f:
    f.write('n'.join(list(df.loc[df.f=='N','c'].unique())))
  

Комментарии:

1. При этом предложение unique будет выполняться во всех строках, а не только на C, если память не изменяет. Например: Проверяется, уникальна ли вся строка по сравнению с другими.

2. Привет, @ Dustin, это исправлено! но что вы имели в виду, говоря «если память работает»? Если там есть ‘c’, это приведет к удалению дубликатов на основе ‘c’ else на основе всей строки.

3. С исправлением все в порядке! Даже не знал, что вы можете просто поставить запятую между ними, и это отфильтрует

Ответ №2:

Похоже, вам нужен модуль под названием pandas. Это очень популярно, особенно в науке о данных и преобразовании данных.

 import pandas as pd

df = pd.read_csv(r"inputpath.csv")
df = df[df["f"] == "N"] # filter F for N
df = df[["C"]] # mi&ht be possible with only one pair of []. Only keep column C
df = df.drop_duplicates(subset="C") # explains itself, doesn't it!
df.to_csv(r"outputpath.csv")

  

Ответ №3:

Вы можете использовать set на последнем шаге

 In [1]: d = {1,1,1,2,2,3,3,3,}   # this a set, not a dictionary.

In [2]: d
Out[2]: {1, 2, 3}
  

хорошо, просто чтобы узнать больше деталей

 In [5]: my_set = set()

In [6]: my_set.add(2)

In [7]: my_set
Out[7]: {2}

In [8]: my_set.add(3)

In [9]: my_set
Out[9]: {2, 3}

In [10]: my_set.add(2)

In [11]: my_set
Out[11]: {2, 3}

In [12]: