Mam pytanie dotyczące usuwania duplikatów w języku Python. Przeczytałem kilka postów, ale jeszcze nie udało mi się go rozwiązać. Mam następujący plik CSV:Usuwanie duplikatów w języku Python
EDIT
Wejście:
ID, Source, 1.A, 1.B, 1.C, 1.D
1, ESPN, 5,7,,,M
1, NY Times,,10,12,W
1, ESPN, 10,,Q,,M
wyjściowe powinny być:
ID, Source, 1.A, 1.B, 1.C, 1.D, duplicate_flag
1, ESPN, 5,7,,,M, duplicate
1, NY Times,,10,12,W, duplicate
1, ESPN, 10,,Q,,M, duplicate
1, NY Times, 5 (or 10 doesn't matter which one),7, 10, 12, W, not_duplicate
w słowach, jeśli identyfikator jest samo, weź wartości z wiersza ze źródłem "NY Times", jeśli r ow przy "NY Times" ma pustą wartość, a zduplikowany wiersz ze źródła "ESPN" ma wartość dla tej komórki, pobierz wartość z wiersza ze źródłem "ESPN". Aby uzyskać wyjście, oznacz flagą dwa oryginalne wiersze jako duplikaty i utwórz trzecią linię.
Aby wyjaśnić nieco dalej, bo trzeba uruchomić skrypt na wielu różnych plików csv z różnymi nagłówkami kolumn, nie mogę zrobić coś takiego:
def main():
with open(input_csv, "rb") as infile:
input_fields = ("ID", "Source", "1.A", "1.B", "1.C", "1.D")
reader = csv.DictReader(infile, fieldnames = input_fields)
with open(output_csv, "wb") as outfile:
output_fields = ("ID", "Source", "1.A", "1.B", "1.C", "1.D", "d_flag")
writer = csv.DictWriter(outfile, fieldnames = output_fields)
writer.writerow(dict((h,h) for h in output_fields))
next(reader)
first_row = next(reader)
for next_row in reader:
#stuff
Ponieważ chcę program do uruchomienia na dwie pierwsze kolumny niezależnie od innych kolumn w tabeli. Innymi słowy, "ID" i "Źródło" będą w każdym pliku wejściowym, ale reszta kolumn zmieni się w zależności od pliku.
Bardzo doceniam każdą pomoc, którą możesz zapewnić! FYI, "Źródło" może być tylko: NY Times, ESPN lub Wall Street Journal, a kolejność priorytetów dla duplikatów jest: wziąć NY Times, jeśli jest dostępna, w przeciwnym razie wziąć ESPN, inaczej wziąć Wall Street Journal. Dotyczy to każdego pliku wejściowego.
Dzięki za wspaniałą odpowiedź. Działa bardzo dobrze na danych. Przepraszam za opóźnienie w odpowiedzi, chciałem sam przejrzeć kod, aby upewnić się, że naprawdę rozumiem, dlaczego to działa. Wpadłem na jeden problem: jeśli dany wiersz ma takie same wartości "ID" i "Źródło", wówczas obecny skrypt po prostu weźmie ostatni wiersz z tą szczególną kombinacją "ID" i "Źródło". Czy istnieje sposób na zmodyfikowanie kodu w taki sposób, aby wszystkie oryginalne wiersze zostały skopiowane na wyjście (z tagiem "duplikat", jeśli ma to zastosowanie) ORAZ wiersz "not_duplicate" zostanie wypełniony, aby uniknąć problemu wymienionego w tym komentarzu? – user7186
Dodam przykładowy punkt danych do powyższego wpisu jako zmiany, aby łatwiej było to zobaczyć. Jeszcze raz dziękuję! Jest to bardzo pomocne i nauczyłem się go przepisywać. – user7186
W nowym przykładzie powyżej istnieją dwa wiersze z "ID" = 1 i "SOURCE" = ESPN. Jeśli nie ma wartości dla danej kolumny w wierszu "NY Times" i jest wartość w obu kolumnach wierszy "ESPN", nie ma znaczenia, z jakiego wiersza ESPN go korzystamy, tylko że jesteśmy konsekwentni w całej akta. Jeśli jednak wiersz "NY Times" nie ma wartości dla konkretnej kolumny i jeden wiersz "ESPN" (ESPN A) również nie ma wartości dla tej kolumny, pobierz z innego wiersza "ESPN" (ESPN B) . A jeśli ESPN A ma wartość, ale ESPN B nie, a wiersz "NY Times" nie, odbierz z ESPN A. – user7186