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.csv
es el archivo que consiste en los duplicados. -
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:
- abriendo un archivo en el modo de lectura. Este es el archivo que tiene los duplicados.
- Luego, en un bucle que se ejecuta hasta que finaliza el archivo, verificamos si la línea ya se ha encontrado.
- Si se ha encontrado, no lo escribimos en el archivo de salida.
- 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