pandas数组索引不足

时间:2016-07-07 17:15:02

标签: python pandas dataframe anaconda

我在DataFrame变量中有一个pandas result,并希望从中提取一些行,具体来说,是通过成对的id和选择行对它们进行分组,对应于最低score s。

以下是代码:

gb = result.groupby(['id1', 'id2'], sort=False, group_keys=False, as_index=False)
result1 = result.loc[gb['score'].idxmin()].dropna()

我已停止调试器中的代码以检查结果的正确性。结果很奇怪。

>>> gb['score'].idxmin().shape
Out[11]: (1800L,)

>>> result1.shape
Out[12]: (1810, 6)

这10行来自哪里?!

此外,我在Jupyter笔记本中以相同的数据文件交互式运行完全相同的代码,并且有1800行。

我正在使用Anaconda进行所有更新。这是版本字符串

Python 2.7.11 |Anaconda 4.0.0 (64-bit)| (default, Feb 16 2016, 09:58:36) [MSC v.1500 64 bit (AMD64)]

1 个答案:

答案 0 :(得分:3)

result必须在其索引中包含重复的标签。例如,

import numpy as np
import pandas as pd

result = pd.DataFrame({'X':np.arange(6)}, index=list('ABAAEF'))
print(result)
#    X
# A  0
# B  1
# A  2
# A  3
# E  4
# F  5

一个索引标签'A'对应三行

print(result.loc[['A']])
#    X
# A  0
# A  2
# A  3

要确保idxmin返回的标签对应于唯一行,您需要result才能拥有唯一索引。使用setindex生成此类索引,或调用reset_indexresult提供通用整数索引:

result = result.reset_index()
#   index  X
# 0     A  0
# 1     B  1
# 2     A  2
# 3     A  3
# 4     E  4
# 5     F  5

gb = result.groupby(['id1', 'id2'], sort=False, group_keys=False, as_index=False)
result1 = result.loc[gb['score'].idxmin()].dropna()

检查您的DataFrame是否具有唯一索引的简单方法是检查Index.is_unique属性:

In [53]: result = pd.DataFrame({'X':np.arange(6)}, index=list('ABAAEF'))
In [54]: result.index.is_unique
Out[54]: False

In [55]: df = pd.DataFrame({'X':np.arange(6)})
In [56]: df.index.is_unique
Out[56]: True