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 № 1De 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.