Python/Pandas:执行分组应用时出现意外索引



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

  • Python 3.5.1 (via Anaconda 2.5.0( 64 位
  • 熊猫 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

这段代码是一个简单的分组应用,但我不明白结果:

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

出于某种原因,结果的索引是['a','a'],这似乎是熊猫的一个非常可疑的选择。我本来会期望一个简单的['a']。

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

提前谢谢。

发生这种情况是因为sort_values返回数据帧或系列,因此索引正在连接到现有的 groupby 索引,如果您在"b"列上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

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

最新更新