2017-09-28 2 views
3

Ich habe folgende Daten-Set in einer CSV-Datei:Wie kann man bestimmte Spalten eines Pandas-Datenrahmens ausschließen?

feature1, feature2, feature3, feature4 
0, 42, 2, 1000 
2, 13, ?, 997 
1, 30, ?, 861 
2, 29, ?, ? 

Ich mag würde einen Pandas Datenrahmen oder ein numpy Array erstellen, wo ich nicht die Eigenschaften mit einer x% den unbekannten Daten (wobei x wurde zuvor im Code angegeben).

+0

Die Frage ist nicht klar für mich, können Sie die erwartete Ausgabe – Wen

+0

Für einen zeigen Beispiel von 0% der Zulassung von fehlenden Daten, ich möchte nur Feature1, Feature2 und ihre jeweiligen Daten zu meinem Pandas Datenrahmen speichern Für 25% wäre feature4 auch enthalten –

+0

Also, Sie versuchen um all das '' 'durch etwas zu ersetzen? Ist das deine Frage? –

Antwort

4

Durch die Verwendung von replace und dropna (PS, müssen Sie den Parameter dreschen in dropna mit)

import pandas as pd 
import numpy as np 
df.replace('?', np.NaN).dropna(axis=1,thresh=0.75*len(df)) # for you example , we only accpet one NA here 

Out[735]: 
    feature1 feature2 feature4 
0   0   1  100.0 
1   2   2  900.0 
2   1   3  861.0 
3   2   4  NaN 

Data Input

df = pd.DataFrame({'feature1': [0,2,1,2], 'feature2': [1,2,3,4],'feature3':[2,'?','?','?'],'feature4':[100,900,861,'?']}) 
+0

Wow, es scheint, als wäre das ein Fehler auf der SO-Seite. Sie haben eine Antwort früher gepostet und dann gelöscht. Während ich an meiner Antwort arbeitete, hielt ich die Seite offen und überprüfte, ob jemand schon geantwortet hatte. Aber die Seite hat Ihre Antwort nicht angezeigt, weil Sie Ihre ursprüngliche Antwort "wiederhergestellt" haben. SO hat keine neuen Antworten gezeigt. Also konnte ich nicht wissen, dass jemand schon geantwortet hat. –

0

Dies ist wahrscheinlich der einfachste Weg, es zu lösen, wenn ich deine Frage richtig verstehe. Sie können ? zu NaN mit np.nan ändern, dann df.loc und df.isnull verwenden, um die Spalten auszuwählen, die Sie benötigen.

df.replace(to_replace= '\?', value=np.nan, inplace=True, regex=True) 
df = df.loc[:, (df.isnull().sum() <= len(df)/4)] 
print (df) 
     feature1 feature2 feature4 
0   0   42  1000 
1   2   13  997 
2   1   30  861 
3   2   29  NaN 
1

Ich werde diejenigen '?' sind NULL-Werte zu übernehmen. Wenn nicht, gehen Sie wie folgt vor:

df = df.apply(pd.to_numeric, errors='coerce') 

Jetzt können wir eine Funktion erstellen, die einen Datenrahmen und einen Schwellenwert annimmt. Was wir tun wollen, ist loc mit einer booleschen Reihe, die uns sagt, welche Spalten eine ausreichende Datendarstellung haben.

drp = lambda d, x: d.loc[:, d.isnull().mean() < x] 

drp(df, .5) 

    feature1 feature2 feature4 
0   0  42 1000.0 
1   2  13  997.0 
2   1  30  861.0 
3   2  29  NaN 

Wenn Sie darauf bestehen, dass '?' so bleiben ... und wir können auch NaN

d = df.mask(df.astype(object).eq('?')) 

drp = lambda d, x: d.loc[:, d.isnull().mean() < x] 

drp(d, .5) 
+0

Das OP sagte tatsächlich in seinem Kommentar, dass die '?' Keine Nullwerte sind. –

Verwandte Themen