Cómo indexar en un panddex multindex con ix

He configurado un código como este:

import pandas as pd import numpy as np arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'], ['aaa', 'bbb', 'ccc', 'ccc', 'ddd', 'eee', 'eee', 'eee' ]] tuples = zip(*arrays) index = pd.MultiIndex.from_tuples(tuples, names=['A', 'B', 'C']) df = pd.DataFrame(np.random.randn(8, 4), index=index) df Out[161]: 0 1 2 3 ABC bar one aaa 0.682220 -0.598889 -0.600635 -0.488069 two bbb -0.134557 1.614224 -0.191303 0.073813 baz one ccc -1.006877 -0.137264 -0.319274 1.465952 two ccc 0.107222 0.358468 0.165108 -0.258715 foo one ddd 0.360562 1.759095 -1.385394 -0.646850 two eee -1.113520 0.221483 2.226704 -0.994636 qux one eee -0.609271 -0.888330 0.824189 1.772536 two eee -0.008346 -0.688091 0.263303 1.242485 

Quiero encontrar filas coincidentes basadas en combinaciones de criterios con los grupos A, B y C.

por ejemplo, en términos de SQL: seleccione * donde A en (‘foo’, ‘qux’) y C = ‘eee’

¿Puedo lograr esto con ix? por ejemplo, algo como:

 df.ix(['foo', 'qux'],:,'eee') 

¿Cuál es la forma idónea de lograr esto para conjuntos de datos muy grandes?

(Actualmente estoy usando pandas 0.7 pero puedo actualizar si es absolutamente necesario)

Escribiré una función para hacer este tipo de cosas genéricamente:

 import numpy as np def ms(df, *args): idx = df.index for i, values in enumerate(args): if values is not None: if np.isscalar(values): values = [values] idx = idx.reindex(values, level=i)[0] return df.ix[idx] 

Entonces puedes hacerlo muy fácilmente:

 ms(df, ['foo', 'qux'], None, "eee") 

A partir de Pandas 0.14 , puede pasar una tupla de selectores a df.loc para cortar un MultiIndex:

 In [782]: df.loc[(['foo','qux'], slice(None), 'eee'), :] Out[782]: 0 1 2 3 ABC foo two eee 1.615853 -1.327626 0.772608 -0.406398 qux one eee 0.472890 0.746417 0.095389 -1.446869 two eee 0.711915 0.228739 1.763126 0.558106