[英]get minimal value for each multiindex pandas dataframe
我無法想象如何過濾多索引數據幀,每個索引只保留一行。
這是我的數據:導入隨機導入numpy作為np導入pandas為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,只有匹配df2的數據與'嘗試'的條件,它應該保持df1.trial與df2.attempt最接近的值的行:
C D
ID trial
ID2 2 3 c
ID3 3 5 e
ID4 12 7 g
我找到了一種非常骯臟的方式(有許多“for”迭代......),但我覺得有更美好的事情要做。
我想做的另一件事是在df1中只保留每個multiindex的第一行:
C D
ID trial
ID1 1 1 a
ID2 2 3 c
ID3 5 4 d
ID4 12 7 g
但是在這里,我只會通過創建另一個代碼來獲取臟代碼。
謝謝您的幫助。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.