2016-07-07 3 views
1

Ich habe eine Pandas DataFrame in dem result Variable bekommt und will einige Zeilen daraus extrahieren, und zwar Gruppe sie durch Paare von id s und Zeilen auswählen, auf ein Minimum score s entsprechen. HierUnzureichende Indizierung von Pandas Array

ist der Code:

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

ich den Code im Debugger Ergebnisse zu überprüfen für Richtigkeit gestoppt haben. Die Ergebnisse sind seltsam.

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

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

Woher kommen diese 10 Zeilen ?!

Mehr, ich habe genau den gleichen Code in Jupyter Notebook interaktiv auf der gleichen Datei ausgeführt, und haben 1800 Zeilen.

Ich benutze Anaconda mit allen Updates. Hier ist die Versionsstring

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

In der Tat war das Problem in nicht eindeutigen Index. Das Datenrahmenergebnis wurde von "pd.concat ([df1, df2])" erhalten. Das Hinzufügen von 'ingore_index = True' hat das Problem gelöst. Und die Jupyter Zelle enthielt tatsächlich "ignore_index = True". – wl2776

Antwort

3

result müssen doppelte Etiketten in seinem Index haben. Zum Beispiel

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 

Ein Index-Label, 'A', entspricht drei Reihen

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

Um die Etiketten von idxmin entsprechen eindeutige Zeilen zurückgegeben sicherzustellen, Sie result müssen einen eindeutigen Index haben . Entweder verwenden setindex einen solchen Index zu erzeugen, oder reset_indexresult eine generische Integer-Index zu geben nennen:

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

Eine einfache Möglichkeit, zu überprüfen, ob Ihre Datenrahmen einen eindeutigen Index hat, ist die Index.is_unique Eigenschaft zu überprüfen:

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

Danke, ich werde es versuchen. Aber warum gibt genau derselbe Code, der in einer interaktiven Jupyter-Zelle in derselben Datendatei läuft, 1800 Zeilen zurück? – wl2776

+0

Wenn es in Ihrem Code keine Zufälligkeit gibt, habe ich keine Ahnung, warum das Ergebnis anders sein würde, wenn es interaktiv in Jupyter läuft. Wenn nur eines der Ergebnisse korrekt ist und Sie herausfinden können, welches Ergebnis falsch ist und ein reproduzierbares Beispiel liefert, dann haben Sie die Voraussetzungen für einen Fehlerbericht ([Pandas] (https://github.com/pydata/pandas/) Ausgaben)/[Jupyter] (https://github.com/jupyter/notebook/issues)). In jedem Fall weist das oben beschriebene Symptom auf einen nicht eindeutigen Index hin. – unutbu