我在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
我不认为这是一个错误,而是一些语义要注意一些方法将返回一个对象,其中索引将与预先存在的索引对齐.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。