如何在任何条件下 return 多索引中的所有索引

How to return all indexes in multiindex on ANY condition

我正在努力研究多级索引。

具体来说,我正在尝试获取满足 'ANY' 标准的所有 0 级指标。 但我终其一生都无法理解如何让它发挥作用。

例如,在下面的数据框中,我们希望所有在 'test_variable_2'

列中具有“3”的索引
event_name test_variable_1 test_variable_2 test_variable_3
subject_id
1 pre_event NaN 3 foo
1 intra_event 15 NaN bar
1 post_event 30 NaN fum
2 pre_event NaN 2 foo
2 intra_event 45 NaN NaN
2 post_event 60 NaN fum
3 pre_event NaN 3 foo
3 intra_event_1 75 NaN bar
3 intra_event_2 90 NaN NaN
3 post_event 105 NaN fum

结果应该是:

event_name test_variable_1 test_variable_2 test_variable_3
subject_id
1 pre_event NaN 3 foo
1 intra_event 15 NaN bar
1 post_event 30 NaN fum
3 pre_event NaN 3 foo
3 intra_event_1 75 NaN bar
3 intra_event_2 90 NaN NaN
3 post_event 105 NaN fum

我考虑过使用 .groupby 函数,但我担心我丢失了一些包含多个值的测试变量。 到目前为止,我的解决方案是 select 填充布尔掩码的指标,然后删除所有其他指标,但它看起来很麻烦,而且不是很熊猫。

我确信有一种方法可以利用多级索引。任何正确方向的指示都会有所帮助。

使用groupby().transform:

df[df['test_variable_2'].eq(3).groupby(level=0).transform('any')]

或者您可以只对有效索引使用 unique

df.loc[df[df.test_variable_2.eq(3)].index.unique()]

输出:

               event_name  test_variable_1  test_variable_2 test_variable_3
subject_id                                                                 
1               pre_event              NaN              3.0             foo
1             intra_event             15.0              NaN             bar
1              post_event             30.0              NaN             fum
3               pre_event              NaN              3.0             foo
3           intra_event_1             75.0              NaN             bar
3           intra_event_2             90.0              NaN             NaN
3              post_event            105.0              NaN             fum

试试

out = df.loc[df.index.isin(df.index[df['test_variable_2'].eq(3)])]

Out[529]: 
               event_name  test_variable_1  test_variable_2 test_variable_3
subject_id                                                                 
1               pre_event              NaN              3.0             foo
1             intra_event             15.0              NaN             bar
1              post_event             30.0              NaN             fum
3               pre_event              NaN              3.0             foo
3           intra_event_1             75.0              NaN             bar
3           intra_event_2             90.0              NaN             NaN
3              post_event            105.0              NaN             fum

可以在此处用 .eq

链接 .loc

请注意,这仅适用于唯一索引值,按照@Quang Hoang 的建议添加 unique 子句会更安全。


df.loc[df.loc[df['test_variable_2'].eq(3)].index]


  event_name  test_variable_1  test_variable_2 test_variable_3
subject_id                                                                 
1               pre_event              NaN              3.0             foo
1             intra_event             15.0              NaN             bar
1              post_event             30.0              NaN             fum
3               pre_event              NaN              3.0             foo
3           intra_event_1             75.0              NaN             bar
3           intra_event_2             90.0              NaN             NaN
3              post_event            105.0              NaN             fum

我也不认为你有多重索引,但如果你有,你可以用 .index.get_level_values(0) 替换 index 以获得级别 0 值,然后使用 isin

假设您的有效索引已分配给名为 valid_indexes

的变量
df.loc[df.index.isin(valid_indexes,level=0)]