/ / Разбиране на pandas groupby / прилагане на поведение - python, pandas

Разбиране на pandas groupby / прилагане на поведение - python, pandas

Да вземем следното 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

бягам

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

и това е отпечатано

    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

Нямам нищо против да върна нищо, просто искамда разбере защо отпечатва точно същия изход два пъти и след това няколко различни изхода. Не трябва ли изходът от отпечатването по-скоро да бъде различна подгрупа всеки път? Какво ми липсва?

Отговори:

3 за отговор № 1

Според документи

При текущото изпълнение се прилагат обажданията funcдва пъти в първата колона / ред, за да решите дали тя може да отнеме бърза или бавна кодова пътека. Това може да доведе до неочаквано поведение, ако функцията има странични ефекти, тъй като те ще влязат в сила два пъти за първата колона / ред.


1 за отговор № 2

Аз ... не знам, това е странно. Аз всъщност мога да възпроизведа проблема.

Имайте предвид, че имате малка грешка, трябва да напишете df.groupby(["series"]) вместо df(by=["series"]).

import seaborn as sns

iris = sns.load_dataset("iris")

Сега това изявление отпечатва двойна част.

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

продукция

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

Това, което е извънредно странно, е, че ако поискам името, то няма да удвои печата.

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

продукция

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

Добре. Хвана ме! Изглежда странен бъг.