2013-01-10 37 views
5

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.

Odpowiedz

2

Poniższy kod odczytuje wszystkie rekordy do dużego słownika, którego klucze są ich identyfikatorami i których wartości to słowniki odwzorowujące nazwy źródłowe na całe wiersze danych. Następnie przechodzi przez słownik i podaje wynik, o który prosiłeś.

+0

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

+0

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

+0

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

Powiązane problemy