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!

Author: Georgy, 2013-11-06

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.

 342
Author: jeremiahbuddha,
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, i Series.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.

 29
Author: MarredCheese,
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
 20
Author: 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
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
 15
Author: user2921752,
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()
 8
Author: muon,
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.

 6
Author: Kath,
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)
 1
Author: Vicky Miao,
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

 -1
Author: Chirag Maliwal,
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