/ / Entender el comportamiento de grupo de pandas / aplicar - pitón, pandas

Entender el comportamiento de aplicar panda groupby / apply - python, pandas

Tomemos el siguiente 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

Corro

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

y esto está impreso

    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

No me importa no devolver nada, solo quieropara entender por qué imprime exactamente la misma salida dos veces y luego un par de salidas diferentes. ¿No debería el resultado de la impresión ser un subgrupo diferente cada vez? ¿Qué me estoy perdiendo?

Respuestas

3 para la respuesta № 1

De acuerdo con la documentos

En la implementación actual aplica llamadas funcdos veces en la primera columna / fila para decidir si puede tomar una ruta de código rápida o lenta. Esto puede conducir a un comportamiento inesperado si el func tiene efectos secundarios, ya que tendrán efecto dos veces para la primera columna / fila.


1 para la respuesta № 2

Yo ... no sé. Es extraño. De hecho, soy capaz de replicar el problema.

Tenga en cuenta que tiene un pequeño error, debe escribir df.groupby(["series"]) en lugar de df(by=["series"]).

import seaborn as sns

iris = sns.load_dataset("iris")

Ahora esta declaración imprime una parte doble.

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

Salida

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

Lo que es extra extraño, es que si pido el nombre, no dobla la impresión.

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

Salida

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

Bien. ¡Me tienes! Parece un error extraño.