¿En Python Pandas como puedo filtrar un dataFrame con parte del contenido de una cadena?

publicado por: Anonymous

Tengo un dataFrame que tiene una columna llamada 'linea'. Quiero filtrar el dataFrame solo con los renglones que tienen la palabra "GRANEL" en su contenido y descartar todos los demás renglones. Para filtrar actualmente utilizo el código:

lista_produccion_terminado_granel = lista_produccion_terminado[(lista_produccion_terminado['linea']=='P3 EMB. A GRANEL')]

Pero este solamente me sirve si la cadena completa es igual. Si hay una celda que tiene el valor "P1 EMB.A GRANEL" ya no funciona.

¿Me podrían sugerir cómo filtrar el dataFrame utilizando parte de la cadena en la condición?

solución

Usa pandas.Series.str.contains para crear la máscara boleana con solo las filas que tengan la subcadena en esa columna. Un ejemplo:

>>> import pandas as pd

>>> data = {"col1": ("abcd efg", "granel", "ab granel cd", "afgdv", "ab GRANEL", "12458"),
            "col2": (45,45,89,23,55,77)}

>>> df = pd.DataFrame(data)
>>> filtro = df[df['col1'].str.contains("GRANEL", case=False)]
>>> filtro

           col1  col2
1        granel    45
2  ab granel cd    89
4     ab GRANEL    55

El argumento case indica si debe o no diferenciar entre mayúsculas y minúsculas. Si solo quieres que valide “GRANEL” y no “granel”, “Granel”, etc basta con dejarlo darle valor de True.

Ten en cuenta que se usa el operador in de Python, por lo que “abcgraneldfg” sería también validada. Si esta posibilidad pudiera existir y solo quieres validar la palabra individual, debes usar una expresión regular:

>>> import pandas as pd

>>> data = {"col1": ("¿GRANEL?", "GRANEL ABC", "GRANEL", "GRANELCD", "A GRANEL.", "12458"),
            "col2": (45,45,89,23,55,77)}

>>> df = pd.DataFrame(data)
>>> filtro = df[df['col1'].str.contains(r"bGRANELb", regex=True)]
>>> filtro
         col1  col2
0    ¿GRANEL?    45
1  GRANEL ABC    45
2      GRANEL    89
4   A GRANEL.    55
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *