了解pandas groupby / apply行为

时间:2016-09-01 09:46:44

标签: 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

我不介意不归还任何东西;我只是想了解为什么它打印完全相同的输出两次然后输出几个不同的输出。打印输出不应该每次都是不同的子组吗?我错过了什么?

2 个答案:

答案 0 :(得分:3)

根据docs

  

在当前实现中,在第一列/行上应用调用func两次,以确定它是否可以采用快速或慢速代码路径。如果func有副作用,这可能会导致意外行为,因为它们会对第一列/行生效两次。

答案 1 :(得分:1)

我不知道。有点奇怪。我实际上能够复制这个问题。

请注意,您有一个小错误,您应该写df.groupby(["series"])而不是df(by=["series"])

import seaborn as sns

iris = sns.load_dataset('iris')

现在这个语句打印一个double部分。

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

好。你有我的!看起来像一个奇怪的bug。