2012-09-22 14 views
5

Tengo un .txt grande con datos en formatos incorrectos. Me gustaría eliminar algunas filas y convertir el resto de los datos en números flotantes. Me gustaría eliminar filas con 'X' o 'XX', El resto lo debe convertir a flotar, igual número 4;00.1 se deben convertir a 4.001 El archivo se ve como este ejemplo:eliminando filas particulares de DataFrame en python pandas

0,1,10/09/2012,3:01,4;09.1,5,6,7,8,9,10,11 
1,-0.581586,11/09/2012,-1:93,0;20.3,739705,,0.892921,5,,6,7 
2,XX,10/09/2012,3:04,4;76.0,0.183095,-0.057214,-0.504856,NaN,0.183095,12 
3,-0.256051,10/09/2012,9:65,1;54.9,483293,0.504967,0.074442,-1.716287,7,0.504967,0.504967 
4,-0.728092,11/09/2012,0:78,1;53.4,232247,4.556,0.328062,1.382914,NaN,4.556,4 
5,4,11/09/2012,NaN,NaN,6.0008,NaN,NaN,NaN,6.000800,6.000000,6.000800 
6,X,11/09/2012,X,X,5,X,8,2,1,17.000000,33.000000 
7,,11/09/2012,,,,,,6.000000,5.000000,2.000000,2.000000 
8,4,11/09/2012,7:98,3;04.5,5,6,3,7.000000,3.000000,3.000000,2 
9,6,11/09/2012,2:21,4;67.2,5,2,2,7,3,8.000000,4.000000 

lo leí a trama de datos y elegir filas

from pandas import * 
from csv import * 
fileName = '~/data.txt' 
colName = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'] 
df = DataFrame(read_csv(fileName, names=colName)) 
print df[df['b'].isin(['X','XX',None,'NaN'])].to_string() 

Una salida de la última última línea me da solamente:

>>> print df[df['b'].isin(['X','XX',None,'NaN'])].to_string() 
    b   c  d  e   f   g   h i   j k l 
a                     
2 XX 10/09/2012 3:04 4;76.0 0.183095 -0.057214 -0.504856 NaN 0.183095 12 NaN 
6 X 11/09/2012  X  X 5.000000   X 8.000000 2 1.000000 17 33 

nO recoger la fila 7, y me gustaría revisar toda la columna no solo una (el archivo original es muy grande).

En este momento para la conversión lo uso como a continuación, pero primero necesito eliminar las filas no deseadas para aplicarlo a todos los df.

convert1 = lambda x : x.replace('.', '') 
convert2 = lambda x : float(x.replace(';', '.')) 
newNumber = convert2(convert1(df['e'][0])) 

Después de seleccionar las filas que me gustaría sacarlos de df, trato df.pop() pero funciona sólo para la columna no para las filas. Intento nombrar las filas, pero no la suerte. En este particular .txt debería terminar con un nuevo df de las filas [0,3,8,9] con la columna 'c' como formato de fecha, 'd' como formato de tiempo y el resto como float. Intento averiguarlo desde hace bastante tiempo, pero no sé dónde moverme, ¿es posible en pandas (probablemente debería estarlo) o debo cambiar a ndarray o cualquier otra cosa? Gracias por su consejo

+1

Como soy un usuario nuevo, me gustaría saber qué está mal con esta pregunta que está abajo votada? – tomasz74

Respuesta

6

El problema con su filtro original es que comprueba 'NaN' en lugar de numpy.nan, que es lo que las cadenas vacías se analizan como por defecto. Si desea filtrar todas las columnas lo que sólo recibe filas en las que no hay elemento 'X' o 'XX', hacer algo como esto:

In [45]: names = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'] 

In [46]: df = pd.read_csv(StringIO(data), header=None, names=names) 

In [47]: mask = df.applymap(lambda x: x in ['X', 'XX', None, np.nan]) 

In [48]: df[-mask.any(axis=1)] 
Out[48]: 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 5 entries, 0 to 9 
Data columns: 
a 5 non-null values 
b 5 non-null values 
c 5 non-null values 
d 5 non-null values 
e 5 non-null values 
f 5 non-null values 
g 5 non-null values 
h 5 non-null values 
i 5 non-null values 
j 4 non-null values 
k 5 non-null values 
l 5 non-null values 
dtypes: float64(6), int64(1), object(5) 
+0

Genial. Muchas gracias – tomasz74

Cuestiones relacionadas