repeated remove libreria duplicated drop data python file-io

python - remove - pandas repeated



Eliminando filas duplicadas de un archivo csv usando un script de python (4)

Gol

He descargado un archivo CSV de hotmail, pero tiene muchos duplicados. Estos duplicados son copias completas y no sé por qué mi teléfono los creó.

Quiero deshacerme de los duplicados.

Enfoque

Escribe una secuencia de comandos de python para eliminar los duplicados.

Especificación técnica

Windows XP SP 3 Python 2.7 CSV file with 400 contacts


Puedes lograr la deduplicación eficientemente usando Pandas:

import pandas as pd file_name = "my_file_with_dupes.csv" file_name_output = "my_file_without_dupes.csv" df = pd.read_csv(file_name, sep="/t or ,") # Notes: # - the `subset=None` means that every column is used # to determine if two rows are different; to change that specify # the columns as an array # - the `inplace=True` means that the data structure is changed and # the duplicate rows are gone df.drop_duplicates(subset=None, inplace=True) # Write the results to a different file df.to_csv(file_name_output)


Puedes usar el siguiente script:

condición previa:

  1. 1.csv es el archivo que consiste en los duplicados.
  2. 2.csv es el archivo de salida que no tendrá duplicados una vez que se ejecute este script.

código

inFile = open(''1.csv'',''r'') outFile = open(''2.csv'',''w'') listLines = [] for line in inFile: if line in listLines: continue else: outFile.write(line) listLines.append(line) outFile.close() inFile.close()

Explicación del algoritmo

Aquí, lo que estoy haciendo es:

  1. abriendo un archivo en el modo de lectura. Este es el archivo que tiene los duplicados.
  2. Luego, en un bucle que se ejecuta hasta que finaliza el archivo, verificamos si la línea ya se ha encontrado.
  3. Si se ha encontrado, no lo escribimos en el archivo de salida.
  4. Si no, lo escribiremos en el archivo de salida y lo agregaremos a la lista de registros que ya se han encontrado

Una versión más eficiente de la solución de @ jamylak: (con una instrucción menos)

with open(''1.csv'',''r'') as in_file, open(''2.csv'',''w'') as out_file: seen = set() # set for fast O(1) amortized lookup for line in in_file: if line not in seen: seen.add(line) out_file.write(line)

Para editar el mismo archivo en el lugar, puede utilizar este

import fileinput seen = set() # set for fast O(1) amortized lookup for line in fileinput.FileInput(''1.csv'', inplace=1): if line not in seen: seen.add(line) print line, # standard output is now redirected to the file


ACTUALIZACIÓN: 2016

Si está feliz de usar la útil biblioteca externa more_itertools :

from more_itertools import unique_everseen with open(''1.csv'',''r'') as f, open(''2.csv'',''w'') as out_file: out_file.writelines(unique_everseen(f))

Una versión más eficiente de la solución de @ IcyFlame

with open(''1.csv'',''r'') as in_file, open(''2.csv'',''w'') as out_file: seen = set() # set for fast O(1) amortized lookup for line in in_file: if line in seen: continue # skip duplicate seen.add(line) out_file.write(line)

Para editar el mismo archivo en el lugar, puede utilizar este

import fileinput seen = set() # set for fast O(1) amortized lookup for line in fileinput.FileInput(''1.csv'', inplace=1): if line in seen: continue # skip duplicate seen.add(line) print line, # standard output is now redirected to the file