2016-02-28 15 views
5

Voglio rimuovere tutte le righe (o prendere tutte le righe senza) un simbolo punto interrogativo in qualsiasi colonna. Voglio anche modificare gli elementi nel tipo float.Eliminare righe con un valore 'punto interrogativo' in qualsiasi colonna in un dataframe panda

ingresso:

X Y Z 
0 1 ? 
1 2 3 
? ? 4 
4 4 4 
? 2 5 

uscita:

X Y Z 
1 2 3 
4 4 4 

Preferibilmente usando le operazioni panda dataframe.

+1

'out = df.replace ({ '?': Numpy.nan}). Dropna() .astype (float) ' –

+0

È la stessa della risposta in basso, ma molto bella con una sola riga. Grazie – Anonymous

risposta

3

È possibile provare prima la stringa di ricerca ? in colonne, creare la maschera booleana e le ultime righe di filtro - utilizzare boolean indexing. Se avete bisogno di convertire le colonne di float, utilizzare astype:

print ~((df['X'] == '?') (df['Y'] == '?') | (df['Z'] == '?')) 
0 False 
1  True 
2 False 
3  True 
4 False 
dtype: bool 


df1 = df[~((df['X'] == '?') | (df['Y'] == '?') | (df['Z'] == '?'))].astype(float) 
print df1 
    X Y Z 
1 1 2 3 
3 4 4 4 

print df1.dtypes 
X float64 
Y float64 
Z float64 
dtype: object 

Oppure si può provare:

df['X'] = pd.to_numeric(df['X'], errors='coerce') 
df['Y'] = pd.to_numeric(df['Y'], errors='coerce') 
df['Z'] = pd.to_numeric(df['Z'], errors='coerce') 
print df 
    X Y Z 
0 0 1 NaN 
1 1 2 3 
2 NaN NaN 4 
3 4 4 4 
4 NaN 2 5 
print ((df['X'].notnull()) & (df['Y'].notnull()) & (df['Z'].notnull())) 
0 False 
1  True 
2 False 
3  True 
4 False 
dtype: bool 

print df[ ((df['X'].notnull()) & (df['Y'].notnull()) & (df['Z'].notnull())) ].astype(float) 
    X Y Z 
1 1 2 3 
3 4 4 4 
+0

Ricevo un errore TypeEr: confronto tipo non valido – Anonymous

+0

Che cos'è il tipo di valori con '?'? Prova a controllarlo 'print type (df.at [0, 'Z'])' - c'è '?' – jezrael

+0

Funziona per una colonna. Quindi rimuove le righe fini per un indicizzatore booleano. Ma non appena uso | (o) fallisce – Anonymous