python - str - pandas split column
pandas+dataframe-seleccionar por cadena parcial (8)
Tengo un DataFrame
con 4 columnas de las cuales 2 contienen valores de cadena. Me preguntaba si habría una manera de seleccionar filas basadas en una cadena de concordancia parcial con una columna en particular.
En otras palabras, una función o función lambda que haría algo como
re.search(pattern, cell_in_question)
devolviendo un booleano. Estoy familiarizado con la sintaxis de df[df[''A''] == "hello world"]
pero parece que no puedo encontrar la manera de hacer lo mismo con una cadena de caracteres parcial que diga ''hello''
.
¿Alguien podría apuntarme en la dirección correcta?
¿Cómo filtraría la "libertad" excepto con más criterios como "legado", "úlico", etc.?
df_Fixed[~df_Fixed["Busler Group"].map(lambda x: x.startswith(''Liberty''))]
Digamos que tienes el siguiente DataFrame
:
>>> df = pd.DataFrame([[''hello'', ''hello world''], [''abcd'', ''defg'']], columns=[''a'',''b''])
>>> df
a b
0 hello hello world
1 abcd defg
Siempre puede usar el operador in en una expresión lambda para crear su filtro.
>>> df.apply(lambda x: x[''a''] in x[''b''], axis=1)
0 True
1 False
dtype: bool
El truco aquí es usar la opción axis=1
en la apply
para pasar elementos a la función lambda fila por fila, en lugar de columna por columna.
Esto es lo que terminé haciendo para coincidencias de cadenas parciales. Si alguien tiene una forma más eficiente de hacerlo, hágamelo saber.
def stringSearchColumn_DataFrame(df, colName, regex):
newdf = DataFrame()
for idx, record in df[colName].iteritems():
if re.search(regex, record):
newdf = concat([df[df[colName] == record], newdf], ignore_index=True)
return newdf
Estoy usando pandas 0.14.1 en macos en el portátil ipython. Probé la línea propuesta arriba:
df[df[''A''].str.contains("Hello|Britain")]
y obtuve un error:
"cannot index with vector containing NA / NaN values"
pero funcionó perfectamente cuando se agregó una condición "== True", como esta:
df[df[''A''].str.contains("Hello|Britain")==True]
Nota rápida: si desea realizar una selección basada en una cadena parcial contenida en el índice, intente lo siguiente:
df[''stridx'']=df.index
df[df[''stridx''].str.contains("Hello|Britain")]
Según el número github #620 , parece que pronto podrás hacer lo siguiente:
df[df[''A''].str.contains("hello")]
Actualización: los métodos de cadenas vectorizadas (es decir, Series.str) están disponibles en pandas 0.8.1 y superiores.
Si alguien se pregunta cómo realizar un problema relacionado: "Seleccionar columna por cadena parcial"
Utilizar:
df.filter(like=''hello'') # select columns which contain the word hello
Y para seleccionar filas por coincidencia parcial de cadena, pase el axis=0
para filtrar
# selects rows which contain the word hello in their index label
df.filter(like=''hello'', axis=0)
import pandas as pd
k=pd.DataFrame([''hello'',''doubt'',''hero'',''help''])
k.columns=[''some_thing'']
t=k[k[''some_thing''].str.contains("hel")]
d=k.replace(t,''CS'')
:::SALIDA:::
k
Out[95]:
some_thing
0 hello
1 doubt
2 hero
3 help
t
Out[99]:
some_thing
0 hello
3 help
d
Out[96]:
some_thing
0 CS
1 doubt
2 hero
3 CS