python - seleccionar - pandas dataframe
¿Cómo se filtran los dataframes pandas por múltiples columnas (2)
Para filtrar un marco de datos (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 abarcaran varios años y solo quisiera 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 de la dataframe original en un nuevo objeto de marco de datos)
Pregunta 2. ¿Cómo hago esto en un bucle y creo un objeto de marco de datos para cada conjunto único de año y género (es decir, un df para: 2013-Hombre, 2013-Mujer, 2014-Masculino y 2014-Mujer
for y in year:
for g in gender:
df = .....
Para 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 True o False dependiendo de cualquier condición que desee (x1, x2).
Usando &
operador, no te olvides de envolver las declaraciones secundarias con ()
:
males = df[(df[Gender]==''Male'') & (df[Year]==2014)]
Para almacenar sus dataframes 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 demostración para tu getDF
:
def getDF(dic, gender, year):
return dic[gender][year]
print genDF(dic, ''male'', 2014)