我在Python3上使用Pandas和Numpy,版本如下:
以下是产生问题的最小代码:
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会选择复制索引中的列?
提前致谢。
答案 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
我不认为这是一个错误而是一些语义要注意某些方法将返回一个对象,其中索引将与预先存在的索引对齐。