Mam pewne problemy z funkcją stosowania Pand, gdy używam wielu kolumn z następującą ramką danych
df = DataFrame ({'a' : np.random.randn(6),
'b' : ['foo', 'bar'] * 3,
'c' : np.random.randn(6)})
i następująca funkcja
def my_test(a, b):
return a % b
Kiedy próbuję zastosować tę funkcję do:
df['Value'] = df.apply(lambda row: my_test(row[a], row[c]), axis=1)
Pojawia się komunikat o błędzie:
NameError: ("global name 'a' is not defined", u'occurred at index 0')
Nie rozumiem tej wiadomości, poprawnie zdefiniowałem nazwę.
Byłbym bardzo wdzięczny za wszelką pomoc w tej sprawie
Aktualizacja
Dzięki za pomoc. Naprawdę popełniłem kilka błędów składniowych w kodzie, indeks powinien zostać wstawiony ''. Jednak nadal pojawia się ten sam problem przy użyciu bardziej złożonej funkcji, takiej jak:
def my_test(a):
cum_diff = 0
for ix in df.index():
cum_diff = cum_diff + (a - df['a'][ix])
return cum_diff
apply
jak najwięcej. Jeśli nie jesteś pewien, czy musisz go użyć, prawdopodobnie nie. Polecam rzucić okiem Kiedy powinienem kiedykolwiek chcieć używać pand Apply () w moim kodzie? .my_test(a)
nie wie, codf
jest, ponieważ nie została przekazana jako argument (chyba żedf
ma być globalny, co byłoby okropną praktyką). Musisz przekazać wszystkie potrzebne wartości jako argumenty (najlepiej w kolejności), w przeciwnym razie skąd funkcja wiedziałaby, skąddf
pochodzi? Poza tym programowanie w przestrzeni nazw zaśmieconej zmiennymi globalnymi jest złą praktyką, nie złapie się takich błędów.Odpowiedzi:
Wygląda na to, że zapomniałeś
''
swojego sznurka.BTW, moim zdaniem, bardziej elegancki jest następujący sposób:
źródło
pythonista
powodu niektórych perspektyw, w tym tej.Jeśli chcesz tylko obliczyć (kolumna a)% (kolumna b), nie potrzebujesz
apply
, po prostu zrób to bezpośrednio:źródło
Powiedzmy, że chcemy zastosować funkcję add5 do kolumn „a” i „b” DataFrame df
źródło
Wszystkie powyższe sugestie działają, ale jeśli chcesz, aby twoje obliczenia były bardziej wydajne, powinieneś skorzystać z operacji wektorów numpy (jak wskazano tutaj) .
Przykład 1: zapętlanie za pomocą
pandas.apply()
:Przykład 2: wektoryzacja za pomocą
pandas.apply()
:Przykład 3: wektoryzacja za pomocą tablic numpy:
Wektoryzacja za pomocą tablic numpy poprawiła prędkość o prawie dwa rzędy wielkości.
źródło
Jest to to samo co poprzednie rozwiązanie, ale zdefiniowałem funkcję w samym df.apply:
źródło
Podałem porównanie wszystkich trzech omówionych powyżej.
Używanie wartości
139 µs ± 1,91 µs na pętlę (średnia ± odchylenie standardowe z 7 serii, każda 10000 pętli)
Bez wartości
216 µs ± 1,86 µs na pętlę (średnia ± odchylenie standardowe z 7 serii, 1000 pętli każda)
Zastosuj funkcję
474 µs ± 5.07 µs na pętlę (średnia ± odchylenie standardowe z 7 serii, 1000 pętli każda)
źródło