2012-09-22 22 views
5

Mam duży .txt z danymi w złych formatach. Chciałbym usunąć niektóre wiersze i przekonwertować pozostałe dane na liczby zmiennoprzecinkowe. Chciałbym usunąć wiersze z 'X' lub 'XX', reszta należy przekonwertować do pływaka, numer jak 4;00.1 powinny być zamienione na 4.001 Plik wygląda tej próbki:usuwanie określonych wierszy z DataFrame w pandach Pythona

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 

czytałem go DataFrame i wyboru wierszy

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

wyjście z ostatniej ostatniej linii daje mi tylko:

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

nie działa odbierz wiersz 7 i chciałbym przejść przez całą df nie tylko jedną kolumnę (oryginalny plik jest bardzo duży).

W chwili konwersji używam jak poniżej, ale najpierw trzeba usunąć niechciane wiersze, aby zastosować ją do wszystkich plików df.

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

Po wyborze wiersze chciałbym, aby usunąć je z df, staram df.pop() ale działa tylko dla kolumny nie dla wierszy. Próbuję nazwać rzędy, ale nie mam szczęścia. W tym konkretnym txt powinienem zakończyć z nowym df z wierszy [0,3,8,9] z kolumną "c" jako formatem daty, "d" jako format czasu, a resztą jako zmienną. Próbuję to rozgryźć od dłuższego czasu, ale nie wiem, gdzie się poruszać, czy to możliwe w pandach (prawdopodobnie powinno być) czy muszę zmienić na ndarray czy cokolwiek innego? Dzięki za twoją radę

+1

Ponieważ jestem nowego użytkownika, chciałbym wiedzieć, co jest nie tak z tym pytaniem, że jest przegłosowany? – tomasz74

Odpowiedz

6

Problem z oryginalnym filtrem polega na sprawdzaniu "NaN" zamiast numpy.nan, które domyślnie są analizowane jako puste ciągi. Jeśli chcesz filtrować wszystkie kolumny tak można dostać tylko wiersze, gdzie żaden element nie jest „X” lub „XX”, zrobić coś takiego:

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

Świetnie. Wielkie dzięki – tomasz74

Powiązane problemy