#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]: