2015-04-12 4 views
14

Ich habe einen Pandas Datenrahmen, der einige Zeilen und Spalten hat. Jede Spalte hat eine Kopfzeile. Solange ich weiterhin Datenmanipulationsoperationen in Pandas mache, bleiben meine variablen Header erhalten. Aber wenn ich eine Datenvorverarbeitungsfunktion von Sci-kit-learn lib ausprobiere, verliere ich letztendlich alle meine Header und der Frame wird in eine Matrix von Zahlen umgewandelt.So behalten Sie die Spaltenüberschriften des Datenrahmens nach der Vorverarbeitung in scikit-learn

Ich verstehe, warum es passiert, weil scikit-learn ein numpy ndarray als Ausgabe gibt. Und numpy ndarray, das nur Matrix ist, würde Spaltennamen nicht haben.

Aber hier ist die Sache. Wenn ich ein Modell für mein Dataset erstelle, selbst nach der ersten Datenvorverarbeitung und dem Versuch, ein Modell zu erstellen, muss ich möglicherweise einige Datenmanipulationsaufgaben ausführen, um ein anderes Modell für eine bessere Anpassung auszuführen. Ohne auf den Spaltenkopf zugreifen zu können, macht es schwierig, Daten zu manipulieren, da ich vielleicht nicht weiß, was der Index einer bestimmten Variablen ist, aber es ist leichter, sich den Variablennamen zu merken oder sogar nach df.columns zu suchen.

Wie man das überwinden?

EDIT1: Bearbeiten mit Beispieldaten-Snapshot.

Pclass Sex Age SibSp Parch Fare Embarked 
0 3 0 22 1 0 7.2500 1 
1 1 1 38 1 0 71.2833 2 
2 3 1 26 0 0 7.9250 1 
3 1 1 35 1 0 53.1000 1 
4 3 0 35 0 0 8.0500 1 
5 3 0 NaN 0 0 8.4583 3 
6 1 0 54 0 0 51.8625 1 
7 3 0 2 3 1 21.0750 1 
8 3 1 27 0 2 11.1333 1 
9 2 1 14 1 0 30.0708 2 
10 3 1 4 1 1 16.7000 1 
11 1 1 58 0 0 26.5500 1 
12 3 0 20 0 0 8.0500 1 
13 3 0 39 1 5 31.2750 1 
14 3 1 14 0 0 7.8542 1 
15 2 1 55 0 0 16.0000 1 

Das oben genannte ist im Grunde der Pandas-Datenrahmen. Wenn ich dies jetzt auf diesem Datenrahmen mache, werden die Spaltenüberschriften entfernt.

Neue Daten sind von numpy Array und daher sind die Spaltennamen entfernt.

array([[ 3.  , 0.  , 22.  , ..., 0.  , 
      7.25  , 1.  ], 
     [ 1.  , 1.  , 38.  , ..., 0.  , 
     71.2833 , 2.  ], 
     [ 3.  , 1.  , 26.  , ..., 0.  , 
      7.925  , 1.  ], 
     ..., 
     [ 3.  , 1.  , 29.69911765, ..., 2.  , 
     23.45  , 1.  ], 
     [ 1.  , 0.  , 26.  , ..., 0.  , 
     30.  , 2.  ], 
     [ 3.  , 0.  , 32.  , ..., 0.  , 
      7.75  , 3.  ]]) 

Deshalb möchte ich die Spaltennamen behalten, wenn ich auf meinem Pandas Datenrahmen eine Datenmanipulation zu tun.

+0

Eine Probe des Pandas Code könnte nützlicher sein. Bietet Pandas nicht die Möglichkeit, die Daten aus einem Frame zu extrahieren und sie dann durch eine neue Kopie zu ersetzen? – hpaulj

+2

@Manish: Bitte geben Sie ein sehr einfaches, reproduzierbares Beispiel an! Ein dreizeiliger Datenrahmen würde Ihre Frage verständlicher machen. (Vielleicht würde ich einfach 'saved_cols = df.columns' kopieren und dann dem modifizierten' df' zuweisen, aber das ist es, was Sie brauchen) – cd98

+2

Tatsächlich, wie @ cd98 sagt, kopiert 'saved_cols = df .columns' und dann, wenn Sie die Serie bekommen haben, indem Sie 'pandas.DataFrame (series, saved_cols)' machen, bekommen Sie Ihren Dataframe zurück. Ich mache es zum Beispiel, wenn ich 'train_test_split' verwende, was ein' numpy ndarray' zurückgibt, aber ich muss es als Datenframe verwenden. Darauf kann man nicht besonders stolz sein, aber meiner Meinung nach ist es gut genug. – lrnzcig

Antwort

12

scikit-learn entfernt in der Tat die Spaltenüberschriften in den meisten Fällen, also fügen Sie sie erst später wieder hinzu.

X_imputed_df = pd.DataFrame(X_imputed, columns = X_train.columns) 
+0

Vielen Dank für diese Antwort ... Ich war auf dem gleichen Problem stecken und Ihre Antwort löste mein Problem. – gaurus

+11

Was ist, wenn mein Vorverarbeitungsschritt Feature-Auswahl ist? Angenommen, ich habe 1000 Spalten und nach der Vorverarbeitung (sklearn.feature_selection.SelectPercentile) Es gibt nur 100 Spalten zurück. Wie werde ich wissen, was die Spalten, die entfernt werden und die nicht entfernt werden –

+0

@SupreethMeka hast du jemals herausgefunden? –

1

Nach Ami Tavory's Antwort here, pro Dokumentation auslässt imputer leere Spalten oder Zeilen (: In Ihrem Beispiel mit X_imputed als sklearn.preprocessing Ausgang und X_train wie das Original Datenrahmen, können Sie die Spaltenüberschriften wieder mit setzen kann wie auch immer du es ausführst).
Bevor also die imputer läuft und die Spaltennamen wie above Einstellung, führen Sie so etwas wie dies (für Spalten):

X_train=X_train.dropna(axis=1, how='all') 

df.dropna described here.

Verwandte Themen