【问题标题】:Inadequate indexing of pandas array熊猫数组的索引不足
【发布时间】:2016-07-07 17:15:01
【问题描述】:

我在result 变量中有一个pandas DataFrame 并想从中提取一些行,具体而言,将它们按ids 对分组并选择对应于最小值scores 的行。

代码如下:

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 notebook 中以交互方式在同一个数据文件上运行完全相同的代码,并且有 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)]

【问题讨论】:

  • 确实,问题出在非唯一索引上。数据框result 来自pd.concat([df1, df2])。添加ingore_index=True 解决了这个问题。 Jupyter 单元确实包含 ignore_index=True

标签: python pandas dataframe anaconda


【解决方案1】:

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

【讨论】:

  • 谢谢,我试试。但是为什么完全相同的代码,在同一个数据文件的交互式 Jupyter 单元中运行,却返回 1800 行?
  • 除非在您的代码中使用了一些随机性,否则我不知道为什么在 Jupyter 中以交互方式运行时结果会有所不同。如果只有一个结果是正确的,并且您可以找出哪个结果是错误的并制作一个可重现的示例,那么您就有了错误报告的条件(Pandas/Jupyter)。但无论如何,你上面描述的症状指向一个非唯一索引。
猜你喜欢
  • 2017-02-18
  • 2022-07-10
  • 2016-10-16
  • 2019-01-19
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 2019-06-27
  • 1970-01-01
相关资源
最近更新 更多