Ich lade einige maschinelle Lerndaten aus einer CSV-Datei. Die ersten beiden Spalten sind Beobachtungen und die verbleibenden Spalten sind Merkmale.
Derzeit mache ich Folgendes:
data = pandas.read_csv('mydata.csv')
das gibt so etwas wie:
data = pandas.DataFrame(np.random.rand(10,5), columns = list('abcde'))
Ich mag diesen Datenrahmen in zwei Datenrahmen schneiden: eine mit den Spalten enthalten a
und b
und man die Spalten enthält c
, d
und e
.
Es ist nicht möglich, so etwas zu schreiben
observations = data[:'c']
features = data['c':]
Ich bin mir nicht sicher, was die beste Methode ist. Benötige ich eine pd.Panel
?
Übrigens finde ich die Indizierung von Datenrahmen ziemlich inkonsistent: data['a']
ist erlaubt, aber data[0]
nicht. Auf der anderen Seite data['a':]
ist das nicht erlaubt aber data[0:]
. Gibt es dafür einen praktischen Grund? Dies ist wirklich verwirrend, wenn Spalten von Int indiziert werdendata[0] != data[0:1]
df[5:10]
hinzugefügt , z. B. zum Auswählen von Zeilen ( pandas.pydata.org/pandas-docs/stable/… )Antworten:
2017 Antwort - Pandas 0.20: .ix ist veraltet. Verwenden Sie .loc
Siehe die Ablehnung in den Dokumenten
.loc
verwendet die beschriftungsbasierte Indizierung, um sowohl Zeilen als auch Spalten auszuwählen. Die Beschriftungen sind die Werte des Index oder der Spalten. Das Schneiden mit.loc
enthält das letzte Element..loc
Akzeptiert dieselbe Slice-Notation wie Python-Listen für Zeilen und Spalten. Slice Notation iststart:stop:step
Sie können nach Zeilen und Spalten schneiden. Zum Beispiel, wenn Sie haben 5 Zeilen mit Etiketten
v
,w
,x
,y
,z
quelle
df['newcol'] = df.apply(lambda row: myfunc(row), axis=1)
dann können Sie inmyfunc(row){
... verwendenrow['foo':'ant']
. Zum Beispiel (gemäß dieser StackOverflow-Antwort ) können Sie im Innerenmyfunc
bewerten, ob einer dieser Punkte nicht numerisch ist:row['foo':'ant'].apply(lambda x: isinstance(x, str)).any()
.iloc
sollte jetzt anstelle von verwendet werden.loc
. Repariere das und ich werde es positiv bewerten.Hinweis:
.ix
ist seit Pandas v0.20 veraltet. Sie sollten stattdessen.loc
oder verwenden.iloc
, falls zutreffend.Auf den DataFrame.ix-Index möchten Sie zugreifen. Es ist ein wenig verwirrend (ich stimme zu, dass die Pandas-Indizierung manchmal verwirrend ist!), Aber das Folgende scheint zu tun, was Sie wollen:
Dabei wird .ix [Zeilen-, Spalten-] interpretiert. Weitere Informationen zur Pandas-Indizierung finden Sie hier: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-advanced
quelle
>>>data.ix[:, 'a':'c'] a b c 0 0.859192 0.881433 0.843624 1 0.744979 0.427986 0.177159
df.ix[:,[0,3,4]]
df.ix[:,'b':'e']
?loc
alsix
: stackoverflow.com/a/31593712/4323Nehmen wir als Beispiel den Titanic-Datensatz aus dem Seaborn-Paket
oder
quelle
.ix
ist veraltet.Passing list-likes to .loc or [] with any missing label will raise KeyError in the future, you can use .reindex() as an alternative.
df.loc[:, some_list_of_columns]
Auch gegeben ein DataFrame
Wenn Sie wie in Ihrem Beispiel nur die Spalten a und d extrahieren möchten (z. B. die 1. und 4. Spalte), benötigen Sie iloc mothod aus dem pandas-Datenrahmen und können sehr effektiv verwendet werden. Sie müssen lediglich den Index der Spalten kennen, die Sie extrahieren möchten. Beispielsweise:
werde dir geben
quelle
Sie können entlang der Spalten von a schneiden,
DataFrame
indem Sie auf die Namen jeder Spalte in einer Liste verweisen, wie folgt:quelle
get_loc
Funktion on verwendendata.columns
, um den Index der Spalte 'b' oder was auch immer zu bestimmen.Und wenn Sie hierher gekommen sind, um zwei Spaltenbereiche zu schneiden und zu kombinieren (wie ich), können Sie so etwas tun
Dadurch wird ein neuer Datenrahmen mit den ersten 900 Spalten und (allen) Spalten> 3593 erstellt (vorausgesetzt, Sie haben etwa 4000 Spalten in Ihrem Datensatz).
quelle
Hier erfahren Sie, wie Sie verschiedene Methoden zum selektiven Spaltenschneiden verwenden können, einschließlich selektives Etikettenbasiertes, indexbasiertes und selektives Spaltenschneiden.
quelle
Sein Äquivalent
quelle
Wenn der Datenrahmen so aussieht:
und OUTPUT könnte sein wie
Wenn Sie den logischen Operator np.logical_not verwenden
mehr über
https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.logic.html
andere logische Operatoren
logisch_und (x1, x2, / [, out, where, ...]) Berechnen Sie den Wahrheitswert von x1 UND x2 elementweise.
logisch_oder (x1, x2, / [, out, where, casting, ...]) Berechnen Sie den Wahrheitswert von x1 ODER x2 elementweise.
quelle
Eine andere Möglichkeit, eine Teilmenge von Spalten aus Ihrem DataFrame abzurufen, unter der Annahme, dass Sie alle Zeilen möchten, besteht darin, Folgendes zu tun:
data[['a','b']]
unddata[['c','d','e']]
Wenn Sie numerische Spaltenindizes verwenden möchten, können Sie Folgendes tun:
data[data.columns[:2]]
unddata[data.columns[2:]]
quelle