Tengo un diccionario que puede tomar cualquier longitud, por ejemplo, este:
dic = {'A':'Rome','B':'Japan','C':'EUA'}
y quiero construir una función para filtrar un marco de datos usando el dictado anterior como parámetro, así:
def filter(dic, df):
for k,v in dic.items():
x=df[(df[k]==v) & (df[k]==v) & (df[k]==v)]
return x
Si tuviera que codificar el filtro de arriba sería:
df[(df['A']=='Rome') & (df['B']=='Japan') & (df['C']=='EUA')]
El problema al que me enfrento:
El diccionario no tiene una longitud fija, por lo que el número de parámetros cambiará cada vez.
El código anterior no está iterando correctamente sobre el diccionario.
¿Cómo puedo hacer que funcione esa función de filtro?
Solución del problema
Suponiendo que el dicdiccionario contiene todas las columnas, simplemente use:
df[df.eq(dic).all(1)]
de lo contrario, use:
df[df[list(dic)].eq(dic).all(1)]
Ejemplo:
dic = {'A':'Rome','B':'Japan','C':'EUA'}
df = pd.DataFrame({'A': ['Rome', 'Rome', 'Milan'],
'B': ['Japan', 'Italy', 'Japan'],
'C': ['EUA', 'Italy', 'Japan'],
'D': [1,2,3]
})
df[df[list(dic)].eq(dic).all(1)]
producción:
A B C D
0 Rome Japan EUA 1
No hay comentarios:
Publicar un comentario