Dada una Series me gusta

import pandas as pd

s = pd.Series(['foo', 'bar', 42])

Me gustaría obtener una 'sub-serie' pd.Series(['foo', 'bar']) en la que todos los valores son cadenas. He intentado la indexación booleana así:

s[isinstance(s, str)]

Pero esto da un

KeyError: False

En mi búsqueda de métodos adecuados hasta ahora me encontré con select, pero esto impone un criterio en las etiquetas, no en los valores. ¿Cómo puedo filtrar según (el tipo de) los valores en este caso?

13
Kurt Peek 29 oct. 2017 a las 13:33

3 respuestas

La mejor respuesta

Usa apply o lista de comprensión:

s[s.apply(lambda x: isinstance(x, str))]

Igual que, gracias Jon Clements♦:

s[s.apply(isinstance, args=(str,))]

s[[isinstance(x, str) for x in s]]

Todos regresan:

0    foo
1    bar
dtype: object

Editar:

Esto no se recomienda, gracias cᴏʟᴅsᴘᴇᴇᴅ:

s[s.apply(type) == str]
14
jezrael 29 oct. 2017 a las 10:47

Un pequeño truco con pd.to_numeric:

s[pd.to_numeric(s, errors='coerce').isnull()]

0    foo
1    bar
dtype: object

Si un elemento es numérico, se coacciona con éxito (no NaN) y, por lo tanto, se elimina del resultado final.

1
cs95 29 oct. 2017 a las 10:36

Usaría pd.to_numeric como se indicó anteriormente.

Alternativamente, puede usar str.isalpha

In [109]: s[s.str.isalpha().notnull()]
Out[109]:
0    foo
1    bar
dtype: object
1
Zero 29 oct. 2017 a las 10:45