J'ai un fichier CSV avec des données, j'ai besoin d'écrire dans un nouveau CSV mais je ne peux pas avoir d'entrées en double.
J'ai résolu la partie écriture mais je n'ai pas pu résoudre la partie dupliquée . J'ai jusqu'à présent essayé une boucle imbriquée mais sans succès.
Cela fonctionne mais il y a des doublons
for row in rows: # parsing each column of a row for copy in rows: if row[3] != copy[3] and row[2] != copy[2]: filewriter.writerow([copy[3], copy[4], copy[2]])
Où tout va mal
with open('somefile.csv', 'w') as csvfile: filewriter = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL) filewriter.writerow(['Data', 'MoreData', 'EvenMoreData']) for row in rows: # parsing each column of a row filewriter.writerow([row[3], row[4], row[2]])
3 Réponses :
Par utiliser un ensemble
au lieu d'une liste éliminera les doublons.
for row in set(rows): ...
dans ce cas, il s'agit probablement d'une liste de listes, donc cela pourrait aussi être dans votre intérêt d'utiliser set (row)
si vous voulez des données uniques par ligne.
Vous pouvez utiliser un ensemble de tuples de clés ( ligne [2]
et ligne [3]
dans votre cas) pour garder une trace des clés que vous avez déjà vues:
seen = set() for row in rows: if (row[2], row[3]) not in seen: seen.add((row[2], row[3])) filewriter.writerow([row[3], row[4], row[2]])
Vous pouvez l'importer dans des pandas, supprimer les doublons, puis exporter un nouveau csv:
df.to_csv('my_csv_fixed.csv', sep='\t')
Ce qui précède ajoutera une colonne d'index. Si vous ne le souhaitez pas, indexez la première (0) colonne, ou celle que vous souhaitez:
df = pd.read_csv('my_csv.csv', index_col=0)
De plus, si vous préférez les tabulations comme délimiteur, exportez avec sep
argument de mot-clé:
import pandas pd df = pd.read_csv('my_csv.csv') df.drop_duplicates(keep=False, inplace=True) df.to_csv('my_csv_fixed.csv')
Astuce: utilisez Pandas stackoverflow.com / questions / 23667369 /…
que voulez-vous qu'il se passe s'il y a des entrées en double? Prenez-vous la première entrée ou la seconde?