2012-09-22 22 views
5

Ich habe eine große TXT mit Daten in schlechten Formaten. Ich möchte einige Zeilen entfernen und den Rest der Daten in Gleitkommazahlen konvertieren. Ich möchte Zeilen entfernen, mit 'X' oder 'XX', Der Rest sollte ich konvertieren zu schweben, Zahl wie 4;00.1 sollte die Datei sieht aus wie diese Probe zu 4.001 umgewandelt werden:Entfernen bestimmter Zeilen von DataFrame in 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 

ich es zu Datenrahmen gelesen und wählen Reihen

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

Ein Ausgang von den letzten mir letzte Zeile gibt nur:

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

Does nicht nimm Zeile 7 auf, und ich würde gerne alle df nicht nur eine Spalte durchgehen (Originaldatei ist sehr groß).

Im Moment für die Konvertierung verwende ich wie folgt, aber müssen unerwünschte Zeilen zuerst entfernen, um es auf alle df anzuwenden.

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

Nach Reihen der Wahl Ich mag würde sie von df zu entfernen, versuche ich df.pop() aber es funktioniert nur für die Spalte nicht für Zeilen. Ich versuche Reihen zu benennen, aber kein Glück. In dieser speziellen .txt sollte ich mit einem neuen df aus den Zeilen [0,3,8,9] mit der Spalte 'c' als Datumsformat, 'd' als Zeitformat und dem Rest als Float abschließen. Ich versuche es jetzt schon eine ganze Weile herauszufinden, weiß aber nicht, wo ich mich hinbewegen soll, ist es möglich in Pandas (wahrscheinlich sollte es sein) oder muss ich auf ndarray oder irgendetwas anderes wechseln? Vielen Dank für Ihre Beratung

+1

Da ich einen neuen Benutzer bin, würde ich was wissen, ist falsch mit dieser Frage, dass es abgelehnt wird? – tomasz74

Antwort

6

Das Problem mit Ihrem ursprünglichen Filter ist es überprüft für 'NaN' statt numpy.nan, was leere Zeichenfolgen als Standardwerte analysiert wird. Wenn Sie alle Spalten gefiltert werden sollen, so dass Sie nur die Zeilen, wo kein Element ‚X‘ oder ‚XX‘ ist, etwas tun wie folgt aus:

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

Großartig. Danke vielmals – tomasz74

Verwandte Themen