通过另一个索引或值过滤DataFrame索引

时间:2019-02-20 17:41:23

标签: python pandas

我有一个如下所示的多索引数据框:

                             status      value
id            country                             
1234            US          Complete      54            
2345            US          Ongoing       3 
                UK          Complete      343
                JP          Complete      54
                IT          Complete      32
3456            CA          Ongoing       20
                UK          Complete      123
                FR          Complete      245

我不确定如何创建ID,以便可以通过其他索引(国家/地区)中的某个字段或其中一个值来过滤ID列。

从本质上讲,如果我希望所有不包含“ US”的索引的所有列都可以,并且可以像这样返回:

                             status      value
id            country                             
3456            CA          Ongoing       20
                UK          Complete      123
                FR          Complete      245

或者还可以说出“过滤出至少有1个状态正在进行的每个ID”并将其取回:

                             status      value
id            country                             
1234            US          Complete      54            

最终,我希望能够将其结合起来,但是学习如何单独进行操作可能是一个不错的第一步。

1 个答案:

答案 0 :(得分:2)

您的第二个问题,没有Ongoing

sliceidx=~df.index.get_level_values(0).isin(df.loc[df.status=='Ongoing'].index.get_level_values(0))
df[sliceidx]
Out[474]: 
                status  value
id   country                 
1234 US       Complete     54

您的第一个问题US

sliceidx=df.index.get_level_values(0)[df.index.get_level_values(1)=='US']
df[~df.index.get_level_values(0).isin(sliceidx)]
Out[478]: 
                status  value
id   country                 
3456 CA        Ongoing     20
     UK       Complete    123
     FR       Complete    245

更多信息:我通常要做的是reset_index

df1=df.copy().reset_index()
df[df1.country.ne('US').groupby(df1['id']).transform('all').values]
Out[486]: 
                status  value
id   country                 
3456 CA        Ongoing     20
     UK       Complete    123
     FR       Complete    245

df[df1.status.ne('Ongoing').groupby(df1['id']).transform('all').values]
Out[487]: 
                status  value
id   country                 
1234 US       Complete     54