2017-04-10 7 views
1

Ich kann nicht herausfinden, wie man einen multiindexed Datenrahmen filtert und nur eine Reihe pro Index behält.erhalten minimalen Wert für jeden Multiindex Pandas Datenrahmen

Hier sind meine Daten: Import Zufalls Import numpy als np Import Pandas als pd

A = np.array(['ID1', 'ID1', 'ID2', 'ID3', 'ID3', 'ID3', 'ID4', 'ID4']) 
B = np.array([1, 2, 2, 5, 3, 7, 12, 9]) 
C = np.array([1,2,3,4,5,6,7,8]) 
D = list('abcdefgh') 

df1 = pd.DataFrame(zip(A, B, C, D), columns=['ID', 'trial', 'C', 'D']) 
df1.set_index(['ID', 'trial'], inplace=True) 

a = np.array(['ID2', 'ID3', 'ID4']) 
b = np.array([2,2,11]) 
df2 = pd.DataFrame(zip(a,b), columns = ['sub', 'attempt']) 

df1:

  C D 
ID trial  
ID1 1  1 a 
    2  2 b 
ID2 2  3 c 
ID3 5  4 d 
    3  5 e 
    7  6 f 
ID4 12  7 g 
    9  8 h 

df2:

sub attempt 
0 ID2  2 
1 ID3  2 
2 ID4  11 

Und ich würde gerne von df1 fernhalten, nur die daten bei dem DF2 übereinstimmt mit einer Bedingung auf ‚Versuch‘, sollte es die Zeile mit dem nächsten Wert hält für df1.trial df2.attempt:

  C D 
ID trial  
ID2 2  3 c 
ID3 3  5 e 
ID4 12  7 g 

ich eine wirklich schmutzige Art und Weise gefunden (mit vielen „für“ Iteration ...), aber ich habe das Gefühl, dass es etwas Schöneres zu tun gibt.

Ein andere Sache, die ich tun möchte, ist nur die erste Zeile jeden Multiindex in DF1 zu halten:

  C D 
ID trial  
ID1 1  1 a 
ID2 2  3 c 
ID3 5  4 d 
ID4 12  7 g 

Aber auch hier, ich schmutzigen Code nur bekommen, durch ein anderes zu schaffen.

Vielen Dank für Ihre Hilfe.

Antwort

0
s = df2['sub'] 
idx = pd.Series(
    df1.index.get_level_values('trial'), 
    df1.index 
).groupby(level=0).idxmin() 
df1.loc[idx].query('ID in @s') 

      C D 
ID trial  
ID2 2  3 c 
ID3 3  5 e 
ID4 9  8 h 
+0

Vielen Dank für Ihre Antwort, es gibt mir eine erste Richtung. Aber in meinem Fall ist die Spalte "C" oder "D" nicht unbedingt geordnet, deshalb möchte ich die erste Zeile. Auch 'C' und 'D' können nicht Integer oder String, sondern Objekte sein. – POINTEAG

+0

Aktualisierte Antwort @POINTEAG – piRSquared

Verwandte Themen