es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo eliminar valores dentro de un rango específico en los archivos csv.

Tengo un archivo CSV con coordenadas y valores y quiero filtrarlo en un rango específico, con 157<x<480.

Intenté esto:

import numpy as np
from scipy.spatial import cKDTree as KDTree
import csv
import sys
import os
from scipy.interpolate import griddata

meanflowdata='fieldlp3.csv' #../Mean Flow Data/hcmd<em>3</em>100000.csv
f=os.path.splitext(os.path.basename(meanflowdata))
outputfile=f[0]+'<em>cut' + f[1]
xd=[]
yd=[]
zd=[]
cd=[]
rhod=[]
range_start=157.0
range_end=480.0
with open(meanflowdata,'rb') as csvfile:
    spamreader=csv.reader(csvfile, delimiter=',')
    for row in spamreader:
        if len(row)>2:
            mask = np.logical_and(float(row[0])>=range_start, float(row[0])<=range_end)
            rows = 
            xd.append(float(row[0]))
            yd.append(float(row[1]))
            zd.append(float(row[2]))
            rhod.append(float(row[3]))
            cd.append(float(row[4]))

Xd=np.sort(np.asarray([xd,yd,zd,cd,rhod]))

print
mask = np.logical_and(Xd.T[:,0]>=range_start, Xd.T[:,0]<=range_end)
xd =  Xd.T[:,0][mask]

print "# Escribiendo salida"
with open(outputfile, 'wb') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter=',')
    for i in range(len(xd)):
       spamwriter.writerow([str(xd[i]),str(yd[i]),str(zd[i]),str(cd[i]),str(rhod[i])])

pero así toma los valores correctos para la coordenada X y los valores incorrectos para las otras variables. ¿Hay alguna manera de seleccionar en el archivo CSV solo las filas entre mi rango y escribirlas en otro archivo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de seleccionar solo las filas que caen dentro del rango deseado y escribirlas en un nuevo archivo CSV. Aquí está una versión actualizada de su código que debería lograr esto:

    import csv
    
    meanflowdata = 'fieldlp3.csv'
    range_start = 157.0
    range_end = 480.0
    outputfile = 'filtered_data.csv'
    
    def filter_rows(row):
        """
        Función auxiliar para filtrar filas según la coordenada x.
        """
        x = float(row[0])
        return range_start <= x <= range_end
    
    # Lee los datos del CSV y filtra según el rango deseado.
    rows_to_write = []
    with open(meanflowdata, 'r') as csvfile:
        csvreader = csv.reader(csvfile, delimiter=',')
        header = next(csvreader)  # omite la fila de encabezado
        for row in csvreader:
            if filter_rows(row):
                rows_to_write.append(row)
    
    # Escribe los datos filtrados en un nuevo archivo CSV.
    with open(outputfile, 'w', newline='') as csvfile:
        csvwriter = csv.writer(csvfile)
        csvwriter.writerow(header)
        csvwriter.writerows(rows_to_write)
    
    print(f"Datos filtrados escritos en {outputfile}.")
    

    Este código define una función auxiliar filter_rows que verifica si la coordenada x de una fila cae dentro del rango deseado. Luego lee los datos del CSV y filtra las filas que no cumplen esta condición, almacenando las filas restantes en una lista. Finalmente, escribe las filas filtradas en un nuevo archivo CSV con el mismo encabezado que el archivo original.

Comments are closed.