Ich versuche, auf den Index einer Zeile in einer Funktion zuzugreifen, die DataFrame
in Pandas auf eine gesamte Funktion angewendet wird . Ich habe so etwas:
df = pandas.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c'])
>>> df
a b c
0 1 2 3
1 4 5 6
und ich werde eine Funktion definieren, die auf Elemente mit einer bestimmten Zeile zugreift
def rowFunc(row):
return row['a'] + row['b'] * row['c']
Ich kann es so anwenden:
df['d'] = df.apply(rowFunc, axis=1)
>>> df
a b c d
0 1 2 3 7
1 4 5 6 34
Genial! Was ist nun, wenn ich den Index in meine Funktion integrieren möchte? Der Index einer bestimmten Zeile in dieser Zeile DataFrame
vor dem Hinzufügen d
wäre Index([u'a', u'b', u'c', u'd'], dtype='object')
, aber ich möchte die 0 und 1. Ich kann also nicht einfach darauf zugreifen row.index
.
Ich weiß, dass ich eine temporäre Spalte in der Tabelle erstellen könnte, in der ich den Index speichere, aber ich frage mich, ob er irgendwo im Zeilenobjekt gespeichert ist.
apply
? Es ist viel langsamer als vektorisierte Operationen am Frame selbst durchzuführen. (Manchmal gelten ist die einfachste Möglichkeit , etwas zu tun, und Leistungsinformationen werden oft übertrieben, aber für Ihr spezielles Beispiel ist es so einfach nicht , es zu benutzen.)Antworten:
Um in diesem Fall auf den Index zuzugreifen, greifen Sie auf das
name
Attribut zu:Beachten Sie, dass, wenn dies wirklich das ist, was Sie versuchen, Folgendes funktioniert und viel schneller ist:
BEARBEITEN
Wenn Sie sich diese Frage mehr als 3 Jahre später ansehen, können Sie einfach Folgendes tun:
Aber vorausgesetzt, es ist nicht so trivial wie das, was auch immer Sie
rowFunc
wirklich tun, sollten Sie versuchen, die vektorisierten Funktionen zu verwenden und sie dann gegen den df-Index zu verwenden:quelle
name
im Falle eines ein benanntes Tupel wäreMultindex
, damit eine bestimmte Indexebene anhand ihres Namens abgefragt werden könnte.Entweder:
1. mit
row.name
innerhalb desapply(..., axis=1)
Anrufs:2. mit
iterrows()
(langsamer)Mit DataFrame.iterrows () können Sie Zeilen durchlaufen und auf deren Index zugreifen:
quelle
Um die ursprüngliche Frage zu beantworten: Ja, Sie können auf den Indexwert einer Zeile in zugreifen
apply()
. Es ist unter dem Schlüssel verfügbarname
und muss von Ihnen angegeben werdenaxis=1
(da das Lambda die Spalten einer Zeile und nicht die Zeilen einer Spalte verarbeitet).Arbeitsbeispiel (Pandas 0.23.4):
quelle