2016-02-28 7 views
5

Chcę usunąć wszystkie wiersze (lub wszystkie wiersze bez) symbolu znaku zapytania w dowolnej kolumnie. Chcę również zmienić elementy na typ float.Upuść wiersze z wartością "znaku zapytania" w dowolnej kolumnie w ramce danych pandy

Wejście:

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

wyjściowa:

X Y Z 
1 2 3 
4 4 4 

najlepiej przy użyciu operacji pandy dataframe.

+1

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

+0

Jest to ta sama odpowiedź co poniżej, ale bardzo ładna z jednolinijkową. Dziękuję – Anonymous

Odpowiedz

3

Możesz spróbować najpierw znaleźć ciąg znaków ? w kolumnach, utworzyć maskę boolowską i ostatnie wiersze filtrów - użyj boolean indexing. Jeśli trzeba przekonwertować kolumn do float użyć 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 

Albo można spróbować:

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

Otrzymuję TypeError: nieprawidłowe porównanie typów – Anonymous

+0

Jaki jest typ wartości z '?'? Spróbuj sprawdzić 'typ wydruku (df.at [0, 'Z'])' - istnieje '?' – jezrael

+0

Działa dla jednej kolumny. Więc usuwa rzędy grzywny za jeden indeksator boolowski. Ale jak tylko użyję | (lub) nie powiedzie się – Anonymous

Powiązane problemy