¿Cómo filtrar los marcos de datos de pandas por varias columnas?

Para filtrar un dataframe (df) por una sola columna, si consideramos datos con hombres y mujeres, podríamos:

males = df[df[Gender]=='Male'] 

Pregunta 1: ¿Pero qué pasaría si los datos abarcaban varios años y solo quería ver a los hombres para 2014?

En otros idiomas podría hacer algo como:

 if A = "Male" and if B = "2014" then 

(excepto que quiero hacer esto y obtener un subconjunto del dataframe original en un nuevo objeto de dataframe)

Pregunta 2. ¿Cómo hago esto en un bucle y creo un objeto de dataframe para cada conjunto único de año y género (es decir, un df para: 2013-Masculino, 2013-Femenino, 2014-Masculino y 2014-Femenino)

 for y in year: for g in gender: df = ..... 

Usando & operator, no olvide envolver las sub-afirmaciones con () :

 males = df[(df[Gender]=='Male') & (df[Year]==2014)] 

Para almacenar sus marcos de datos en un dict usando un bucle for:

 from collections import defaultdict dic={} for g in ['male', 'female']: dic[g]=defaultdict(dict) for y in [2013, 2014]: dic[g][y]=df[(df[Gender]==g) & (df[Year]==y)] #store the DataFrames to a dict of dict 

EDITAR:

Una demo para tu getDF :

 def getDF(dic, gender, year): return dic[gender][year] print genDF(dic, 'male', 2014) 

Para las funciones booleanas más generales que le gustaría usar como filtro y que dependen de más de una columna, puede usar:

 df = df[df[['col_1','col_2']].apply(lambda x: f(*x), axis=1)] 

donde f es una función que se aplica a cada par de elementos (x1, x2) de col_1 y col_2 y devuelve Verdadero o Falso dependiendo de cualquier condición que desee en (x1, x2).

Comenzar desde pandas 0.13 , esta es la forma más eficiente.

 df.query('Gender=="Male" & Year=="2014" ')