pandas 数组的索引不足
Inadequate indexing of pandas array
我在 result
变量中有一个 pandas DataFrame
并想从中提取一些行,具体来说,按 id
对将它们分组和 select 行,对应于最小 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 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
的索引中必须有重复的标签。例如,
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_index
给 result
一个通用整数索引:
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
我在 result
变量中有一个 pandas DataFrame
并想从中提取一些行,具体来说,按 id
对将它们分组和 select 行,对应于最小 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 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
的索引中必须有重复的标签。例如,
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_index
给 result
一个通用整数索引:
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