2017-04-10 45 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