pandas: filtrado iterativo de las filas de un DataFrame

Supongamos que tengo un DataFrame como tal,

 df = pd.DataFrame([['x', 1, 2], ['x', 1, 3], ['y', 2, 2]], columns=['a', 'b', 'c']) 

Para seleccionar todas las filas donde c == 2 y a == 'x' , podría hacer algo como:

 df[(df['a'] == 'x') & (df['c'] == 2)] 

O podría refinar iterativamente haciendo variables temporales,

 df1 = df[df['a'] == 'x'] df2 = df1[df1['c'] == 2] 

¿Hay una manera de refinar iterativo en filas?

 ( df .refine(lambda row: row['a'] == 'x') # this method doesn't exist .refine(lambda row: row['c'] == 2) ) 

Si bien esta no es una solución por ahora, en la versión 0.13 de pandas podrás hacer

 df.query('a == "x"').query('c == 2') 

para lograr lo que quieres.

También podrás hacer

 df['a == "x"']['c == 2'] 

y

 df['a == "x" and c == 2'] 

Qué hay de malo en

 df[(df.a == 'x') & (df.c == 2)] 

hasta 0.13?

Si tienes un número de términos; El número del cual no sabe hasta el tiempo de ejecución, puede hacer lo siguiente. No estoy diciendo que esta sea una forma hermosa de alcanzar la meta, pero no puedo ver una alternativa con Pandas 0.14.1:

 df = pd.DataFrame([['x', 1, 2], ['x', 1, 3], ['y', 2, 2]], columns=['a', 'b', 'c']) conditions = {'a': 'x', 'c': 2} def esc(term): if isinstance(term, str): return '"%s"' % term return str(term) q_parts = ["%s == %s" % (k, esc(v)) for k, v in conditions.items()] q = ' and '.join(q_parts) print df.query(q) 

Por supuesto, la función esc o el fragmento más amplio tendrían que extenderse más para manejar la lógica-NO, es x en (x, y, z), etc.