我无法想象如何过滤多索引数据帧,每个索引只保留一行。
以下是我的数据: 随机导入 导入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
但是在这里,我只会通过创建另一个代码来获取脏代码。
感谢您的帮助。
答案 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