1
votes

J'ai besoin de lire un fichier CSV et d'écrire dans un nouveau fichier CSV avec 0 doublon

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]])


2 commentaires

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?


3 Réponses :


0
votes

set

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.


0 commentaires

0
votes

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]])


0 commentaires

0
votes

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')


0 commentaires