Use una lista de valores para seleccionar filas de un marco de datos de Pandas

952

Digamos que tengo el siguiente marco de datos de Pandas:

df = DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3, 5]})
df

     A   B
0    5   1
1    6   2
2    3   3
3    4   5

Puedo hacer subconjuntos en función de un valor específico:

x = df[df['A'] == 3]
x

     A   B
2    3   3

Pero, ¿cómo puedo crear un subconjunto basado en una lista de valores? - algo como esto:

list_of_values = [3,6]

y = df[df['A'] in list_of_values]

Llegar:

     A    B
1    6    2
2    3    3
0
1649

Puedes usar el isinmétodo:

In [1]: df = pd.DataFrame({'A': [5,6,3,4], 'B': [1,2,3,5]})

In [2]: df
Out[2]:
   A  B
0  5  1
1  6  2
2  3  3
3  4  5

In [3]: df[df['A'].isin([3, 6])]
Out[3]:
   A  B
1  6  2
2  3  3

Y para obtener el uso contrario ~:

In [4]: df[~df['A'].isin([3, 6])]
Out[4]:
   A  B
0  5  1
3  4  5
10
  • 25
    ¿Cómo devolvería estos valores en el orden de la lista? Por ejemplo, list_of_valuestiene valores 3 luego 6 pero el marco se devuelve con 6 luego 3. No estoy hablando de una ordenación simple, sino de cómo específicamente podemos regresar en el orden de los valores en la lista. 14 de agosto de 2014 a las 17:36
  • 1
    Este fue un ejemplo de indexación booleana que mantiene el orden fuera del índice, consulte pandas.pydata.org/pandas-docs/stable/… para obtener más detalles. Se necesita una ordenación después de la selección. 18 de agosto de 2014 a las 15:16
  • 1
    Esto me ayudó a stackoverflow.com/a/29108799/5629831 25 de mayo de 2016 a las 3:39
  • 8
    También puede lograr resultados similares usando 'consulta' y @ <su lista de valores>: por ejemplo: df = pd.DataFrame ({'A': [1, 2, 3], 'B': ['a', 'b', 'f']}) df = pd.DataFrame ({'A': [5,6,3,4], 'B': [1,2,3, 5]}) lista_de_valores = [3 , 6] resultado = df.query ("A en @list_of_values") resultado AB 1 6 2 2 3 3 28 de septiembre de 2017 a las 3:05
  • 2
    @JasonStrimpel Respondí a su pregunta aquí: stackoverflow.com/questions/51944021/… 21/08/18 a las 7:51
dieciséis

Puede utilizar el método de consulta :

df.query('A in [6, 3]')
# df.query('A == [6, 3]')

o

lst = [6, 3]
df.query('A in @lst')
# df.query('A == @lst')
3
  • 1
    wow, este @ negocio es muy útil
    Matt
    27 de mayo a las 18:54
  • me pregunto si query()es computacionalmente mejor que la isin()función
    Hammad
    29 de agosto a las 14:51
  • 1
    @Hammad Según los documentos de Pandas: "DataFrame.query () usando numexpr es un poco más rápido que Python para marcos grandes". 30 de agosto a las 8:21
1

Otro método;

df.loc[df.apply(lambda x: x.A in [3,6], axis=1)]

A diferencia del método isin , esto es particularmente útil para determinar si la lista contiene una función de la columna A. Por ejemplo, f(A) = 2*A - 5como función;

df.loc[df.apply(lambda x: 2*x.A-5 in [3,6], axis=1)]

Cabe señalar que este enfoque es más lento que el isinmétodo.