2016-07-07 252 views
1

的不足索引我有一個大熊貓DataFrameresult變量,並且希望通過對id期從它提取一些行,具體而言,它們組並選擇的行,對應於最小score秒。大熊貓陣列

下面是代碼:

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)] 
+0

確實,問題出在非唯一索引。數據幀'result'是從'pd.concat([df1,df2])''獲得的。添加'ingore_index = True'已經解決了這個問題。 Jupyter單元格確實包含「ignore_index = True」。 – wl2776

回答

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() 

一個簡單的方法來檢查,如果你的數據幀都有一個唯一的指標是考察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 
+0

謝謝,我會試試看。但爲什麼完全相同的代碼在同一數據文件的交互式Jupyter單元中運行,返回1800行? – wl2776

+0

除非在代碼中使用了隨機性,否則我不知道爲什麼在Jupyter中交互式運行時結果會有所不同。如果只有其中一個結果是正確的,你可以找出哪個結果是錯誤的,並做出可重複的例子,那麼你就有一個錯誤報告的問題([Pandas](https://github.com/pydata/pandas/)問題)/ [Jupyter](https://github.com/jupyter/notebook/issues))。但無論如何,上面描述的症狀都指向了非唯一索引。 – unutbu