Para meu DataFrame multi-indexado fornecido:
df = pd.DataFrame(
np.random.randn(12),
index=[
[1,1,2,3,4,4,5,5,6,6,7,8],
[1,2,1,1,1,2,1,2,1,2,2,2],
]
)
0
1 1 1.667692
2 0.274428
2 1 0.216911
3 1 -0.513463
4 1 -0.642277
2 -2.563876
5 1 2.301943
2 1.455494
6 1 -1.539390
2 -1.344079
7 2 0.300735
8 2 0.089269
Gostaria de dividi-lo de forma que eu mantenha apenas as linhas onde o segundo nível de índice contém AMBOS 1 e 2
0
1 1 1.667692
2 0.274428
4 1 -0.642277
2 -2.563876
5 1 2.301943
2 1.455494
6 1 -1.539390
2 -1.344079
Como posso fazer isso?
Outra solução possível, que se baseia no seguinte:
df.groupby(level=0)
agrupa o dataframe pelo primeiro nível do índice.filter(lambda x: set(x.index.get_level_values(1)) == {1, 2})
verifica se o segundo nível do índice para cada grupo contém 1 e 2 e retém apenas os grupos que atendem a essa condição.Saída:
Você pode converter o Multindex
to_frame
para poder executar uma operaçãogroupby.transform
com aset.issubset
finalidade de gerar uma série para indexação booleana :NB. se você quiser exatamente (não pelo menos)
{1, 2}
, uselambda x: set(x) == {1, 2}
a função as emtransform
.Se você precisar executar isso em comandos encadeados:
Saída:
Intermediário:
Esta é uma alternativa às outras respostas que devem ter melhor desempenho (de preferência ignorando o groupby e usando os métodos do tipo set do próprio pandas): Obtenha os valores no nível 0, onde o nível 1 é 1 e 2, e indexe o dataframe com eles:
Se você tiver mais valores, poderá usar uma compreensão.