获得每个multiindex pandas数据帧的最小值

时间:2017-04-10 07:57:11

标签: python pandas multi-index

我无法想象如何过滤多索引数据帧,每个索引只保留一行。

以下是我的数据:     随机导入     导入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的数据与'attempt'上的条件,它应该保持df1.trial的最接近值为df2.attempt:

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

我发现了一种非常肮脏的方式(有许多“for”迭代......),但我觉得有更美好的事情要做。

我想做的另一件事是在df1中只保留每个多索引的第一行:

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

但是在这里,我只会通过创建另一个代码来获取脏代码。

感谢您的帮助。

1 个答案:

答案 0 :(得分: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