簡體   English   中英

獲得每個multiindex pandas數據幀的最小值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM