2017-04-10 5 views
1

インデックスごとに1つの行しか保持しないマルチインデックスデータフレームをフィルタリングする方法を理解できません。ここで各マルチインデックスpandasデータフレームの最小値を取得

は私のデータです: は、PDとしてNPとして輸入ランダム 輸入numpyの 輸入パンダ

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に一致し、それはdf2.attemptするdf1.trialのための最も近い値を持つ行を維持する必要がありますで:

  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

関連する問題