2016-09-24 6 views
1

Ich habe einen Pandas-Datenrahmen, in dem eine der Spalten einige fehlende Werte hat. Der Datenrahmen besteht aus Hunderten von Zeilen, aber in Spalte 4 sind fünf der Werte ?.Zeilen mit fehlenden Werten in Pandas entfernen

Ich möchte die Zeilen entfernen, in denen Werte ? in dieser Spalte sind.

Ich habe versucht, etwas mit wie

df = df[np.isfinite(df[:,4])] 
+0

Sind sie tatsächlich '?' (Die Zeichenfolge)? Möchten Sie die Zeile entfernen, wenn sie eine Spalte als solche enthält? –

+0

Erreicht die 'DataFrame.dropna()' Methode das, was Sie tun möchten? –

+0

'df [df.iloc [:, 4] .astype (str)! ="? "]'. Das heißt, wenn Spalte 4 Index 4 bedeutet. Andernfalls möchten Sie möglicherweise den Index 3 für Spalte 4 verwenden. – Abdou

Antwort

1

die Zeilen zu entfernen, für die die vierte Spalte ? gleich sind, können Sie die Daten auswählen, die nicht gleich ? sind.

# Test data 
df = DataFrame({ 
     'col0': [0, 1, 2, 3, 4], 
     'col1': [0, 1, 2, 3, 4], 
     'col2': [0, 1, 2, 3, 4], 
     'col3': [0, 1, 2, 3, 4], 
     'col4': [0, 1, 2, '?', '?']}) 

df.loc[df.iloc[:, 4] != '?'] 

    col0 col1 col2 col3 col4 
0  0  0  0  0 0 
1  1  1  1  1 1 
2  2  2  2  2 2 

Wenn Sie die Zeilen beseitigen wollen, für die die vierte Spalte ? enthält, dann ist es ein bisschen schwieriger, da Sie die ? Charakter zu entkommen und einen Standardwert False für die boolean Indizierung und schließlich die boolean zu arbeiten liefern Negation ~.

df.loc[~df.iloc[:,4].str.contains('\?', na = False)] 

    col0 col1 col2 col3 col4 
0  0  0  0  0 0 
1  1  1  1  1 1 
2  2  2  2  2 2 

bearbeiten

Wenn die Spalte nur Zahlen enthält, können Sie auch die folgende Methode verwenden. Mit dem errors Parameter coerce wird in numerisch konvertiert, um NaN für Werte zu erzeugen, die nicht konvertiert werden können. Dann einfach die Werte mit dropna fallen lassen.

df.iloc[] = pd.to_numeric(df.iloc[:,4], errors='coerce') 
# Or if you want to apply the transformation to the entire DataFrame 
# df = df.apply(pd.to_numeric, errors='coerce')  
df.dropna(inplace=True) 

     col0 col1 col2 col3 col4 
0  0  0  0  0 0.0 
1  1  1  1  1 1.0 
2  2  2  2  2 2.0 
+0

Wird die Spalte 4 nicht alle ihre Nummern als Zeichenfolgenwerte enthalten, weil sie beim Laden Zeichenfolgenwerte hatte? – Jamgreen

+0

@Jamgreen Ja, ich habe gerade einen Edit hinzugefügt, um diesen Ansatz zu verwenden. – Romain

Verwandte Themen