/ / Zrozumieć pandy grupy / zastosować zachowanie - python, pandy

Zapoznaj się z grupowaniem pandy / zastosuj zachowanie - python, pandy

Weźmy następującą ramkę DataFrame:

     location   outlook   play  players  temperature
0     Hamburg     sunny   True     2.00        25.00
1      Berlin     sunny   True     2.00        25.00
2   Stuttgart       NaN   True     4.00        19.00
3         NaN       NaN    NaN      nan          nan
4   Flensburg  overcast  False     0.00        33.00
5    Hannover      rain    NaN     0.00        27.00
6  Heidelberg      rain    NaN     0.00        21.50
7   Frankfurt  overcast   True     2.00        26.00
8    Augsburg     sunny   True     2.00        13.00
9       Koeln     sunny   True     2.00        16.00

biegnę

g = df(by=["outlook", "play"])
def gfunc(x):
print(x)
g.apply(gfunc)

i to jest drukowane

    location   outlook   play  players  temperature
4  Flensburg  overcast  False     0.00        33.00
location   outlook   play  players  temperature
4  Flensburg  overcast  False     0.00        33.00
location   outlook  play  players  temperature
7  Frankfurt  overcast  True     2.00        26.00
location outlook  play  players  temperature
0   Hamburg   sunny  True     2.00        25.00
1    Berlin   sunny  True     2.00        25.00
8  Augsburg   sunny  True     2.00        13.00
9     Koeln   sunny  True     2.00        16.00

Nie mam nic przeciwko temu, żebym coś zwrócił, po prostu chcęaby zrozumieć, dlaczego wypisuje dokładnie to samo wyjście dwa razy, a następnie kilka różnych wyników. Nie powinno się wydawać, że wydruk jest inną podgrupą za każdym razem? Czego mi brakuje?

Odpowiedzi:

3 dla odpowiedzi № 1

Według docs

W bieżącej implementacji zastosuj wywołania funcdwa razy w pierwszej kolumnie / wierszu, aby zdecydować, czy może wykonać szybką czy wolną ścieżkę kodu. Może to prowadzić do nieoczekiwanego zachowania, jeśli func ma efekty uboczne, ponieważ będą one działać podwójnie dla pierwszej kolumny / wiersza.


1 dla odpowiedzi nr 2

Ja ... nie wiem To dziwne. Naprawdę jestem w stanie powtórzyć problem.

Zauważ, że masz mały błąd, powinieneś napisać df.groupby(["series"]) zamiast df(by=["series"]).

import seaborn as sns

iris = sns.load_dataset("iris")

Teraz to polecenie drukuje część podwójną.

iris.ix[1:100:10].groupby(["species"]).apply(lambda x: print(len(x), "n***n", x))

Wydajność

5
***
sepal_length  sepal_width  petal_length  petal_width species
1            4.9          3.0           1.4          0.2  setosa
11           4.8          3.4           1.6          0.2  setosa
21           5.1          3.7           1.5          0.4  setosa
31           5.4          3.4           1.5          0.4  setosa
41           4.5          2.3           1.3          0.3  setosa
5
***
sepal_length  sepal_width  petal_length  petal_width species
1            4.9          3.0           1.4          0.2  setosa
11           4.8          3.4           1.6          0.2  setosa
21           5.1          3.7           1.5          0.4  setosa
31           5.4          3.4           1.5          0.4  setosa
41           4.5          2.3           1.3          0.3  setosa
5
***
sepal_length  sepal_width  petal_length  petal_width     species
51           6.4          3.2           4.5          1.5  versicolor
61           5.9          3.0           4.2          1.5  versicolor
71           6.1          2.8           4.0          1.3  versicolor
81           5.5          2.4           3.7          1.0  versicolor
91           6.1          3.0           4.6          1.4  versicolor

To, co jest ekstra dziwne, to to, że gdy pytam o imię, nie podwaja ono druku.

iris.ix[1:100:10].groupby(["species"]).apply(lambda x: print(len(x), x.name, "n***n", x))

Wydajność

5 setosa
***
sepal_length  sepal_width  petal_length  petal_width species
1            4.9          3.0           1.4          0.2  setosa
11           4.8          3.4           1.6          0.2  setosa
21           5.1          3.7           1.5          0.4  setosa
31           5.4          3.4           1.5          0.4  setosa
41           4.5          2.3           1.3          0.3  setosa
5 versicolor
***
sepal_length  sepal_width  petal_length  petal_width     species
51           6.4          3.2           4.5          1.5  versicolor
61           5.9          3.0           4.2          1.5  versicolor
71           6.1          2.8           4.0          1.3  versicolor
81           5.5          2.4           3.7          1.0  versicolor
91           6.1          3.0           4.6          1.4  versicolor

Dobrze. Masz mnie! Wygląda jak dziwny błąd.