Python / Pandas:执行groupby-apply时的意外索引

我在
Python3上使用Pandas和Numpy,具有以下版本:

> Python 3.5.1(通过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

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

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

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

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

提前致谢.

最佳答案 发生这种情况是因为sort_values返回一个DataFrame或Series,因此索引被连接到现有的groupby索引,如果您确实转移了’b’列,就会发生同样的情况:

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

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

点赞