2016-07-09 38 views
5

Questo sembra un compito intrinsecamente semplice, ma trovo molto difficile rimuovere lo '' dal mio intero frame di dati e restituire i valori numerici in ogni colonna, inclusi i numeri che non avevano ''. La dateframe include centinaia di più colonne e si presenta così in breve:Rimuovi caratteri speciali in pda dataframe

Time   A1  A2 
2.0002546296 1499 1592 
2.0006712963 1252 1459 
2.0902546296 1731 2223 
2.0906828704 1691 1904 
2.1742245370 2364 3121 
2.1764699074 2096 1942 
2.7654050926 *7639* *8196* 
2.7658564815 *7088* *7542* 
2.9048958333 *8736* *8459* 
2.9053125000 *7778* *7704* 
2.9807175926 *6612* *6593* 
3.0585763889 *8520* *9122* 

non ho scritto a iterare su ogni colonna df ancora, ma per quanto riguarda la prima colonna va sono venuto su con questo

df['A1'].str.replace('*','').astype(float) 

che produce

0  NaN 
1  NaN 
2  NaN 
3  NaN 
4  NaN 
5  NaN 
6  NaN 
7  NaN 
8  NaN 
9  NaN 
10  NaN 
11  NaN 
12  NaN 
13  NaN 
14  NaN 
15  NaN 
16  NaN 
17  NaN 
18  NaN 
19 7639.0 
20 7088.0 
21 8736.0 
22 7778.0 
23 6612.0 
24 8520.0 

c'è un modo molto semplice per rimuovere il '*' proprio nella dataframe in panda?

risposta

7

uso replace che si applica su tutta dataframe:

df 
Out[14]: 
     Time  A1  A2 
0 2.000255 1499 1592 
1 2.176470 2096 1942 
2 2.765405 *7639* *8196* 
3 2.765856 *7088* *7542* 
4 2.904896 *8736* *8459* 
5 2.905312 *7778* *7704* 
6 2.980718 *6612* *6593* 
7 3.058576 *8520* *9122* 

df=df.replace('\*','',regex=True).astype(float) 

df 
Out[16]: 
     Time A1 A2 
0 2.000255 1499 1592 
1 2.176470 2096 1942 
2 2.765405 7639 8196 
3 2.765856 7088 7542 
4 2.904896 8736 8459 
5 2.905312 7778 7704 
6 2.980718 6612 6593 
7 3.058576 8520 9122 
+2

Aggiungi 'df = df.astype (float)' dopo la sostituzione e ce l'hai. Salto 'inplace' e faccio' df = df.replace ('\ *', '', regex = True) .astype (float) 'e lo chiamo bene. – piRSquared

+0

@piRSquared è una cattiva pratica che usa 'inplace'. – shivsn

+0

No. Solo preferenza. In questo caso, quando si è utilizzato al posto, non si è ripristinato consentendo il concatenamento. Senza di esso, ero in grado di catena astype (float) – piRSquared

0

C'è un'altra soluzione che utilizza mappa e striscia funzioni. Potete vedere il link qui sotto: Pandas DataFrame: remove unwanted parts from strings in a column.

df = 
    Time  A1  A2 
0 2.0  1258 *1364* 
1 2.1  *1254* 2002 
2 2.2  1520 3364 
3 2.3  *300* *10056* 

cols = ['A1', 'A2'] 
for col in cols: 
    df[col] = df[col].map(lambda x: str(x).lstrip('*').rstrip('*')).astype(float) 

df = 
    Time  A1  A2 
0 2.0  1258 1364 
1 2.1  1254 2002 
2 2.2  1520 3364 
3 2.3  300  10056 

La procedura di parsing essere applicata solo sulle colonne desiderate.