Próbuję uzyskać dostęp do indeksu wiersza w funkcji stosowanej w całej DataFrame
Pandas. Mam coś takiego:
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
i zdefiniuję funkcję, która ma dostęp do elementów z podanym wierszem
def rowFunc(row):
return row['a'] + row['b'] * row['c']
Mogę to zastosować w ten sposób:
df['d'] = df.apply(rowFunc, axis=1)
>>> df
a b c d
0 1 2 3 7
1 4 5 6 34
Niesamowite! A co, jeśli chcę włączyć indeks do mojej funkcji? Indeks każdego wiersza w tym DataFrame
przed dodaniem d
byłby Index([u'a', u'b', u'c', u'd'], dtype='object')
, ale chcę 0 i 1. Więc nie mogę po prostu uzyskać dostępu row.index
.
Wiem, że mógłbym utworzyć tymczasową kolumnę w tabeli, w której przechowuję indeks, ale zastanawiam się, czy jest ona gdzieś przechowywana w obiekcie wiersza.
apply
? Jest to znacznie wolniejsze niż wykonywanie wektoryzowanych operacji na samej ramie. (Czasami zastosowanie jest najprostszym sposobem zrobienia czegoś, a względy wydajności są często wyolbrzymione, ale w twoim konkretnym przykładzie równie łatwo jest tego nie używać.)Odpowiedzi:
Aby uzyskać dostęp do indeksu w tym przypadku, należy uzyskać dostęp do
name
atrybutu:Zauważ, że jeśli naprawdę próbujesz to zrobić, poniższe działa i jest znacznie szybsze:
EDYTOWAĆ
Patrząc na to pytanie 3+ lata później, możesz po prostu zrobić:
ale zakładając, że nie jest to tak trywialne, jak to, cokolwiek
rowFunc
naprawdę robisz, powinieneś użyć funkcji wektoryzowanych, a następnie użyć ich względem indeksu df:źródło
name
w przypadku a byłaby to nazwana krotkaMultindex
, tak aby można było zapytać o konkretny poziom indeksu o jego nazwę.Zarówno:
1. z
row.name
wewnętrznąapply(..., axis=1)
rozmową:2. z
iterrows()
(wolniej)DataFrame.iterrows () umożliwia iterację po wierszach i dostęp do ich indeksu:
źródło
Aby odpowiedzieć na pierwotne pytanie: tak, możesz uzyskać dostęp do wartości indeksu wiersza w
apply()
. Jest dostępna pod kluczemname
i wymaga określeniaaxis=1
(ponieważ lambda przetwarza kolumny wiersza, a nie wiersze kolumny).Przykład roboczy (pandy 0.23.4):
źródło