Chcę zastosować funkcję z argumentami do serii w pandach Pythona:
x = my_series.apply(my_function, more_arguments_1)
y = my_series.apply(my_function, more_arguments_2)
...
Dokumentacja opisuje wsparcie dla zastosowania metody, ale nie przyjmuje żadnych argumentów. Czy istnieje inna metoda, która akceptuje argumenty? Albo czy brakuje mi prostego obejścia?
Aktualizacja (październik 2017 r.): Zwróć uwagę, że ponieważ pierwotnie zadano to pytanie, pandy apply()
zostały zaktualizowane, aby obsługiwały argumenty pozycyjne i słowa kluczowe, a łącze do dokumentacji powyżej odzwierciedla to teraz i pokazuje, jak uwzględnić każdy typ argumentu.
functools.partial
lubstarmap
?DataFrame.apply
dokumentację iSeries.apply
dokumentacjęOdpowiedzi:
Nowsze wersje pandy zrobić pozwala przekazać dodatkowe argumenty (patrz nowej dokumentacji ). Więc teraz możesz:
Argumenty pozycyjne są dodawane po elemencie serii.
Dla starszej wersji pand:
Dokumentacja jasno to wyjaśnia. Metoda Apply akceptuje funkcję Pythona, która powinna mieć jeden parametr. Jeśli chcesz przekazać więcej parametrów, powinieneś użyć
functools.partial
sugestii Joela Cornetta w swoim komentarzu.Przykład:
Możesz również przekazać argumenty słów kluczowych za pomocą
partial
.Innym sposobem byłoby utworzenie lambdy:
Ale myślę, że używanie
partial
jest lepsze.źródło
args
argument, czyli krotkę zawierającą dodatkowe argumenty pozycyjne lub ** kwds dla nazwanych. Utworzyłem numer, aby mieć to również dla Series.apply () github.com/pydata/pandas/issues/1829'abc'
,args=('abc')
zostanie on oceniony jako trzy argumenty('a', 'b', 'c')
. Aby tego uniknąć, musisz przekazać krotkę zawierającą ciąg, a aby to zrobić, dodaj przecinek na końcu:args=('abc',)
Kroki:
Przykład
Wynikiem tego przykładu jest to, że każda liczba w ramce danych zostanie dodana do liczby 9.
Wyjaśnienie:
Funkcja „dodaj” ma dwa parametry: i1, i2. Pierwszym parametrem będzie wartość w ramce danych, a drugim to, co przekażemy do funkcji „zastosuj”. W tym przypadku przekazujemy „9” do funkcji stosującej za pomocą argumentu słowa kluczowego „i2”.
źródło
źródło
func
. Więc jeśli chcę złożyć wniosek, wpd.Series.mean(axis=1)
jaki sposób mam wpisaćaxis=1
?Możesz przekazać dowolną liczbę argumentów do funkcji, która
apply
wywołuje za pośrednictwem nienazwanych argumentów, przekazanych jako krotka doargs
parametru lub przez inne argumenty słów kluczowych przechwycone wewnętrznie jako słownik przezkwds
parametr.Na przykład stwórzmy funkcję, która zwraca True dla wartości od 3 do 6, aw przeciwnym razie False.
Ta anonimowa funkcja nie jest zbyt elastyczna. Utwórzmy normalną funkcję z dwoma argumentami do kontrolowania minimalnych i maksymalnych wartości, które chcemy uzyskać w naszej serii.
Możemy powielić wynik pierwszej funkcji, przekazując nienazwane argumenty do
args
:Lub możemy użyć nazwanych argumentów
Lub nawet połączenie obu
źródło