Estoy tratando de crear una función para filtrar un marco de datos de una lista de tuplas. He creado la siguiente función pero no parece estar funcionando. La lista de tuplas tendría un nombre de columna de marco de datos y un valor mínimo y un valor máximo para filtrar.

Eg:

eg_tuple = [('colname1', 10, 20), ('colname2', 30, 40), ('colname3', 50, 60)]

Mi intento de función está abajo:

def col_cut(df, cutoffs):
    for c in cutoffs:
        df_filter = df[ (df[c[0]] >= c[1]) & (df[c[0]] <= c[2])]
    return df_filter

Tenga en cuenta que la función no debe filtrar en filas donde el valor es igual a max o min. Agradezco la ayuda.

1
N86808 26 dic. 2019 a las 15:58

2 respuestas

Utilice np.logical_and + reduce de todas las máscaras creadas por list comprehension con Series.between:

def col_cut(df, cutoffs):
    mask = np.logical_and.reduce([df[col].between(min1,max1) for col,min1,max1 in cutoffs])
    return df[mask]
1
jezrael 26 dic. 2019 a las 13:02

El problema es que cada vez tomas df como fuente para filtrar. Debes filtrar con:

def col_cut(df, cutoffs):
    df_filter = df
    for col, mn, mx in cutoffs:
        dfcol = df_filter[col]
        df_filter = df_filter[(dfcol >= mn) & (dfcol <= mx)]
    return df_filter

Tenga en cuenta que puede usar {{ X0}} [pandas-doc] aquí:

def col_cut(df, cutoffs):
    df_filter = df
    for col, mn, mx in cutoffs:
        df_filter = df_filter[df_filter[col].between(mn, mx)]
    return df_filter
2
Willem Van Onsem 26 dic. 2019 a las 13:01