2017-04-10 117 views
1

我無法計算如何篩選多索引數據框,每個索引只保留一行。得到每個multiindex熊貓數據幀的最小值

這裏是我的數據: 進口隨機 進口numpy的爲NP 進口大熊貓作爲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 

,我會喜歡保持df1,只有數據th在與「嘗試」的狀態下的匹配DF2,應該保持與最接近的值的行df1.trial到df2.attempt:

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

我發現一個非常骯髒的方式(與許多「爲」迭代...),但我覺得有更美好的事情要做。

另一件事我想這樣做,是隻保留每個多指標的第一行DF1:

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

而且在這裏,我只得到髒的代碼,通過創建一個又一個。

謝謝你的幫助。

回答

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

謝謝你的回答,它給了我第一個方向。但在我的情況下,'C'或'D'列不一定是有序的,這就是爲什麼我想要第一行。 'C'和'D'也可以不是整數或字符串,而是對象。 – POINTEAG

+0

已更新答案@POINTEAG – piRSquared