Tengo un marco de datos Pandas con una columna 'htgt' esta columna consiste en una matriz con números dentro. El tamaño de la matriz no es constante. Un ejemplo de los datos:

11                  [16, 69]
12                  [61, 79]
13                  [10, 69]
14                      [81]
15          [12, 30, 45, 68]
16                  [10, 76]
17                   [9, 39]
18              [67, 69, 77]

¿Cómo puedo filtrar todas las filas que tienen el número 10, por ejemplo?

2
Borut Flis 8 sep. 2018 a las 10:38

3 respuestas

La mejor respuesta

No almacene el tipo list en columnas pandas, no es eficiente y dificultará la interacción de sus datos. Simplemente expanda sus listas a columnas:

out = pd.DataFrame(df.htgt.values.tolist())

    0     1     2     3
0  16  69.0   NaN   NaN
1  61  79.0   NaN   NaN
2  10  69.0   NaN   NaN
3  81   NaN   NaN   NaN
4  12  30.0  45.0  68.0
5  10  76.0   NaN   NaN
6   9  39.0   NaN   NaN
7  67  69.0  77.0   NaN

Ahora puede usar operaciones eficientes pandas para buscar filas con 10:

out.loc[out.eq(10).any(1)]
    0     1   2   3
2  10  69.0 NaN NaN
5  10  76.0 NaN NaN

Si insiste en que el resultado esté en forma list, puede usar stack y agg:

out.loc[out.eq(10).any(1)].stack().groupby(level=0).agg(list)
2    [10.0, 69.0]
5    [10.0, 76.0]
dtype: object
1
user3483203 8 sep. 2018 a las 08:02

Puede hacer esto creando primero un índice booleano utilizando la comprensión de la lista:

mask = [(10 in x) for x in df['htgt']]
df[mask]

O una línea si lo prefieres:

df.loc[[(10 in x) for x in df['htgt']]]

[salida]

htgt
13  [10, 69]
16  [10, 76]
2
Chris A 8 sep. 2018 a las 08:03
def check(list):
    return '10' in list

df[df['B'].astype(list).apply(check)]

Salida:

    A   B
2   13  [10, 69]
5   16  [10, 76]
0
Martin Valgur 8 sep. 2018 a las 17:10