Python / Pandas:执行groupby-apply

时间:2017-02-07 14:05:09

标签: python pandas

我在Python3上使用Pandas和Numpy,版本如下:

  • Python 3.5.1(通过Anaconda 2.5.0)64位
  • Pandas 0.19.1
  • Numpy 1.11.2(可能与此无关)

以下是产生问题的最小代码:

import pandas as pd
import numpy as np

a = pd.DataFrame({'i' : [1,1,1,1,1], 'a': [1,2,5,6,100], 'b': [2, 4,10, np.nan, np.nan]})
a.set_index(keys='a', inplace=True)
v = a.groupby(level=0).apply(lambda x: x.sort_values(by='i')['b'].rolling(2, min_periods=0).mean())
v.index.names

这段代码是一个简单的groupby-apply,但我不明白结果:

FrozenList(['a', 'a'])

由于某种原因,结果的索引是['a','a'],这似乎是熊猫的一个非常值得怀疑的选择。我原本期待一个简单的['a']。

有没有人知道为什么Pandas会选择复制索引中的列?

提前致谢。

1 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为sort_values返回一个DataFrame或Series,因此索引被连接到现有的groupby索引,如果您在' b&#39上执行了shift,就会发生同样的情况;柱:

In [99]:
v = a.groupby(level=0).apply(lambda x: x['b'].shift())
v

Out[99]:
a    a  
1    1     NaN
2    2     NaN
5    5     NaN
6    6     NaN
100  100   NaN
Name: b, dtype: float64

即使使用as_index=False,它仍会产生多索引:

In [102]:
v = a.groupby(level=0, as_index=False).apply(lambda x: x['b'].shift())
v

Out[102]:
   a  
0  1     NaN
1  2     NaN
2  5     NaN
3  6     NaN
4  100   NaN
Name: b, dtype: float64

如果lambda返回一个普通标量值,则不会创建重复索引:

In [104]:
v = a.groupby(level=0).apply(lambda x: x['b'].max())
v

Out[104]:
a
1       2.0
2       4.0
5      10.0
6       NaN
100     NaN
dtype: float64

我不认为这是一个错误而是一些语义要注意某些方法将返回一个对象,其中索引将与预先存在的索引对齐。