Czy możesz mi powiedzieć, kiedy stosować te metody wektoryzacji w podstawowych przykładach?
Widzę, że map
jest to Series
metoda, podczas gdy reszta to DataFrame
metody. Miałem jednak wątpliwości apply
i applymap
metody. Dlaczego mamy dwie metody zastosowania funkcji do DataFrame? Ponownie proste przykłady ilustrujące użycie byłyby świetne!
python
pandas
dataframe
vectorization
marillion
źródło
źródło
Odpowiedzi:
Prosto z książki Pythona do analizy danych Wesa McKinneya , str. 132 (Bardzo polecam tę książkę):
Podsumowując,
apply
działa w oparciu o wiersz / kolumnę DataFrame,applymap
działa elementowo na DataFrame imap
działa elementowo na Series.źródło
func
dolambda x: [func(y) for y in x]
, i stosując kolumnę SCSI)map
iapplymap
oba działają pod względem elementów, oczekiwałbym jednej metody (albomap
alboapplymap
), która działałaby zarówno dla Series, jak i DataFrame. Prawdopodobnie istnieją inne względy projektowe i Wes McKinney postanowił wymyślić dwie różne metody.applymap
razem zgroupby
funkcją w pandach?Porównując
map
,applymap
i : Context Mattersap
ply
Pierwsza ważna różnica: DEFINICJA
map
jest zdefiniowany TYLKO w Seriiapplymap
jest zdefiniowany TYLKO w DataFramesapply
jest zdefiniowany na OBUDruga główna różnica: ARGUMENT WEJŚCIOWY
map
akceptujedict
sSeries
lub wywoływalneapplymap
iapply
akceptuj tylko kallazyTrzecia główna różnica: ZACHOWANIE
map
jest elementarne dla seriiapplymap
jest elementowe dla DataFramesapply
działa również elementarnie, ale nadaje się do bardziej złożonych operacji i agregacji. Zachowanie i wartość zwracana zależy od funkcji.Czwarta główna różnica (najważniejsza): WYKORZYSTAĆ PRZYPADEK
map
jest przeznaczony do mapowania wartości z jednej domeny do drugiej, więc jest zoptymalizowany pod kątem wydajności (np.df['A'].map({1:'a', 2:'b', 3:'c'})
)applymap
nadaje się do transformacji elementarnych w wielu wierszach / kolumnach (np.df[['A', 'B', 'C']].applymap(str.strip)
)apply
służy do zastosowania dowolnej funkcji, której nie można wektoryzować (np.df['sentences'].apply(nltk.sent_tokenize)
)Zreasumowanie
źródło
W tych odpowiedziach jest wiele informacji, ale dodaję własną, aby jasno podsumować, które metody działają w układzie tablicowym w porównaniu do elementów. jeremiahbuddha najczęściej to robił, ale nie wspomniał o Series.apply. Nie mam przedstawiciela do komentowania.
DataFrame.apply
działa jednocześnie na całych wierszach lub kolumnach.DataFrame.applymap
,Series.apply
iSeries.map
działają jednocześnie na jednym elemencie.Możliwości
Series.apply
i są w dużym stopniu pokrywające sięSeries.map
, co oznacza, że jedno z nich będzie działać w większości przypadków. Mają jednak niewielkie różnice, niektóre z nich zostały omówione w odpowiedzi osy.źródło
Dodając do innych odpowiedzi,
Series
tam jest również mapa i zastosowanie .Apply może zrobić DataFrame z serii ; jednak mapa po prostu umieści serię w każdej komórce innej serii, co prawdopodobnie nie jest tym, czego chcesz.
Również gdybym miał funkcję z efektami ubocznymi, takimi jak „połączenie z serwerem internetowym”, prawdopodobnie
apply
użyłbym tego ze względu na przejrzystość.Map
może korzystać nie tylko z funkcji, ale także ze słownika lub innej serii. Powiedzmy, że chcesz manipulować permutacjami .Brać
Kwadrat tej permutacji to
Możesz to obliczyć za pomocą
map
. Nie jestem pewien, czy aplikacja jest udokumentowana, ale działa0.15.1
.źródło
@jeremiahbuddha wspomniał, że zastosowanie działa na wierszach / kolumnach, podczas gdy applymap działa na elementach. Wygląda jednak na to, że nadal można zastosować zastosowanie do obliczeń elementarnych ....
źródło
Chciałem tylko wskazać, ponieważ przez chwilę z tym walczyłem
nie modyfikuje to samej ramki danych, należy ją ponownie przypisać
źródło
df = modified_df
lub ustawienieinplace=True
flagi. Również dataframe zmieni jeśli zdać dataframe do funkcji przez odniesienie i modyfikuje funkcja dataframe.ix
lub.where
itd. Nie wiem, co pełne wyjaśnienie jest, gdy trzeba ponownie przypisać, a kiedy nie.Prawdopodobnie najprostsze wyjaśnienie różnicy między aplikacją a mapą aplikacji:
Zastosuj przyjmuje całą kolumnę jako parametr, a następnie przypisuje wynik do tej kolumny
applymap przyjmuje osobną wartość komórki jako parametr i przypisuje wynik z powrotem do tej komórki.
Uwaga: jeśli zastosuje zwraca pojedynczą wartość, po przypisaniu będziesz miał tę wartość zamiast kolumny, a ostatecznie będzie miał tylko wiersz zamiast macierzy.
źródło
Moje zrozumienie:
Z punktu widzenia funkcji:
Jeśli funkcja ma zmienne, które należy porównać w kolumnie / wierszu, użyj
apply
.np
lambda x: x.max()-x.mean()
. :Jeśli funkcja ma być zastosowana do każdego elementu:
1> Jeśli znajduje się kolumna / wiersz, użyj
apply
2> Jeśli dotyczy całej ramki danych, użyj
applymap
źródło
Na podstawie odpowiedzi cs95
map
jest zdefiniowany TYLKO w Seriiapplymap
jest zdefiniowany TYLKO w DataFramesapply
jest zdefiniowany na OBUpodać kilka przykładów
źródło
FOMO:
Poniższy przykład ilustruje
apply
iapplymap
nałożono naDataFrame
.map
funkcja jest stosowana tylko w przypadku serii. Nie możesz aplikowaćmap
na DataFrame.Należy pamiętać, że
apply
można zrobić wszystkoapplymap
, co można, aleapply
ma opcje eXtra .Opcje współczynnika X to:
axis
iresult_type
gdzieresult_type
działa tylko wtedy, gdyaxis=1
(dla kolumn).Jako sidenote,
map
funkcja Series nie powinna być mylona zmap
funkcją Python .Pierwszy jest stosowany w Serii, aby zmapować wartości, a drugi do każdego elementu iterowalnego.
Na koniec nie należy mylić
apply
metody ramki danych zapply
metodą grupowania .źródło