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