Różnica między metodami map, applymap I apply w pandach
Czy możesz mi powiedzieć, kiedy użyć tych metod wektoryzacji z podstawowymi przykładami?
Widzę, że map
jest metodą Series
, podczas gdy reszta to metody DataFrame
. Jednak pomyliłem się co do metod apply
i applymap
. Dlaczego mamy dwie metody zastosowania funkcji do ramki danych? Ponownie, proste przykłady, które ilustrują użycie byłoby świetne!
8 answers
[[6]}prosto z książki Wesa Mckinneya Python for Data Analysis [[8]}, str. 132 (Gorąco polecam tę książkę):
Kolejną częstą operacją jest zastosowanie funkcji na tablicach 1D do każdej kolumny lub wiersza. Metoda apply DataFrame robi dokładnie to:
In [116]: frame = DataFrame(np.random.randn(4, 3), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon'])
In [117]: frame
Out[117]:
b d e
Utah -0.029638 1.081563 1.280300
Ohio 0.647747 0.831136 -1.549481
Texas 0.513416 -0.884417 0.195343
Oregon -0.485454 -0.477388 -0.309548
In [118]: f = lambda x: x.max() - x.min()
In [119]: frame.apply(f)
Out[119]:
b 1.133201
d 1.965980
e 2.829781
dtype: float64
Wiele najczęstszych statystyk tablicowych (takich jak sum I mean) to metody ramek danych, więc stosowanie aplikacji nie jest konieczne.
Można również używać funkcji Pythona opartych na elementach. Załóżmy chcesz obliczyć sformatowany ciąg znaków z każdej wartości zmiennoprzecinkowej w ramce. Można to zrobić za pomocą applymap:
In [120]: format = lambda x: '%.2f' % x
In [121]: frame.applymap(format)
Out[121]:
b d e
Utah -0.03 1.08 1.28
Ohio 0.65 0.83 -1.55
Texas 0.51 -0.88 0.20
Oregon -0.49 -0.48 -0.31
Powodem nazwy applymap jest to, że szereg ma metodę mapową do zastosowania funkcji elementowej:
In [122]: frame['e'].map(format)
Out[122]:
Utah 1.28
Ohio -1.55
Texas 0.20
Oregon -0.31
Name: e, dtype: object
Podsumowując, apply
działa na bazie wierszy / kolumn ramki danych, applymap
działa pod względem elementów na ramce danych, a map
działa pod względem elementów na szeregu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-05 20:40:33
Są świetne informacje w tych odpowiedziach, ale dodaję swoje własne, aby jasno podsumować, które metody działają pod względem tablicy w porównaniu do elementów. jeremiahbuddha głównie to zrobił, ale nie wspomniał o serialach.aplikuj. Nie mam przedstawiciela do komentowania.
DataFrame.apply
operuje na całych wierszach lub kolumnach naraz.DataFrame.applymap
,Series.apply
, iSeries.map
działają na jednym element w czasie.
Istnieje wiele nakładania się możliwości Series.apply
i Series.map
, co oznacza które w większości przypadków zadziałają. Mają jednak pewne niewielkie różnice, z których niektóre zostały omówione w odpowiedzi osa.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-11 15:20:32
Dodając do pozostałych odpowiedzi, w Series
są również Mapa i zastosuj.
Apply może utworzyć ramkę danych z serii; jednak map po prostu umieści serię w każdej komórce innej serii, co prawdopodobnie nie jest tym, czego chcesz.
In [40]: p=pd.Series([1,2,3])
In [41]: p
Out[31]:
0 1
1 2
2 3
dtype: int64
In [42]: p.apply(lambda x: pd.Series([x, x]))
Out[42]:
0 1
0 1 1
1 2 2
2 3 3
In [43]: p.map(lambda x: pd.Series([x, x]))
Out[43]:
0 0 1
1 1
dtype: int64
1 0 2
1 2
dtype: int64
2 0 3
1 3
dtype: int64
dtype: object
Również gdybym miał funkcję z efektami ubocznymi, takimi jak "połącz się z serwerem WWW", prawdopodobnie użyłbym apply
tylko dla jasności.
series.apply(download_file_for_every_element)
Map
może używać nie tylko funkcji, ale także słownik lub inna seria. powiedzmy, że chcesz manipulować permutacjami.
Take
1 2 3 4 5
2 1 4 5 3
Kwadrat tej permutacji wynosi
1 2 3 4 5
1 2 5 3 4
Można obliczyć za pomocą map
. Nie wiem, czy aplikacja własna jest udokumentowana, ale działa w 0.15.1
.
In [39]: p=pd.Series([1,0,3,4,2])
In [40]: p.map(p)
Out[40]:
0 0
1 1
2 4
3 2
4 3
dtype: int64
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-01 16:49:10
@ jeremiahbuddha wspomniał, że apply działa na wierszach/kolumnach, podczas gdy applymap działa w elementach. Ale wydaje się, że nadal możesz używać aplikacji do obliczeń elementów....
frame.apply(np.sqrt)
Out[102]:
b d e
Utah NaN 1.435159 NaN
Ohio 1.098164 0.510594 0.729748
Texas NaN 0.456436 0.697337
Oregon 0.359079 NaN NaN
frame.applymap(np.sqrt)
Out[103]:
b d e
Utah NaN 1.435159 NaN
Ohio 1.098164 0.510594 0.729748
Texas NaN 0.456436 0.697337
Oregon 0.359079 NaN NaN
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-19 17:21:38
Chciałem tylko zaznaczyć, ponieważ zmagałem się z tym przez chwilę
def f(x):
if x < 0:
x = 0
elif x > 100000:
x = 100000
return x
df.applymap(f)
df.describe()
To nie modyfikuje samego ramki danych, musi być ponownie przypisane
df = df.applymap(f)
df.describe()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-26 01:30:24
Prawdopodobnie najprostsze wyjaśnienie różnica między apply i applymap:
Apply przyjmuje całą kolumnę jako parametr, a następnie przypisuje wynik do tej kolumny
Applymap pobiera wartość oddzielnej komórki jako parametr i przypisuje wynik z powrotem do tej komórki.
NB jeśli apply zwróci pojedynczą wartość, będziesz miał tę wartość zamiast kolumny po przypisaniu i ostatecznie będziesz miał tylko wiersz zamiast matrycy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-20 02:10:04
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łego ramki danych, użyj applymap
majority = lambda x : x > 17
df2['legal_drinker'] = df2['age'].apply(majority)
def times10(x):
if type(x) is int:
x *= 10
return x
df2.applymap(times10)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-08 07:34:07
Mocny tekst Seria.map(arg, na_action=None)
Mapuj wartości serii za pomocą korespondencji wejściowej (dict, Seria lub funkcja).
Seria.Zastosuj
Do stosowania bardziej złożonych funkcji na szeregu.
Ramka danych.Zastosuj
Zastosuj funkcję row- / column-wise.
Ramka danych.applymap
Apply a function elementwise on a whole DataFrame.
Źródło: mapa w Pandzie
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-17 10:06:56