recortar poligonos mapa extraer cortar como python regex pandas dataframe trim

python - mapa - extraer poligonos de un shape arcgis



Despojar/recortar todas las cadenas de un marco de datos (6)

Toma de dinero

Aquí hay una versión compacta del uso de applymap con una expresión lambda directa para llamar a strip solo cuando el valor es de un tipo de cadena:

df.applymap(lambda x: x.strip() if type(x) is str else x)

Ejemplo completo

Un ejemplo más completo:

import pandas as pd def trimAllColumns(df): """ Trim whitespace from ends of each value across all series in dataframe """ trimStrings = lambda x: x.strip() if type(x) is str else x return df.applymap(trimStrings) # simple example of trimming whitespace from data elements df = pd.DataFrame([['' a '', 10], ['' c '', 5]]) df = trimAllColumns(df) print(df) >>> 0 1 0 a 10 1 c 5

Ejemplo de trabajo

Aquí hay un ejemplo de trabajo alojado por Trinket: https://trinket.io/python3/65078f3cdf

Limpiando los valores de un marco de datos multitipo en python / pandas, quiero recortar las cadenas. Actualmente lo estoy haciendo en dos instrucciones:

import pandas as pd df = pd.DataFrame([['' a '', 10], ['' c '', 5]]) df.replace(''^/s+'', '''', regex=True, inplace=True) #front df.replace(''/s+$'', '''', regex=True, inplace=True) #end df.values

Esto es bastante lento, ¿qué podría mejorar?


Puede usar DataFrame.select_dtypes para seleccionar columnas de string y luego apply función str.strip .

Aviso: Los valores no pueden ser types como los dicts o las lists , porque sus dtypes son object .

df_obj = df.select_dtypes([''object'']) print (df_obj) 0 a 1 c df[df_obj.columns] = df_obj.apply(lambda x: x.str.strip()) print (df) 0 1 0 a 10 1 c 5

Pero si solo hay unas pocas columnas usa str.strip :

df[0] = df[0].str.strip()


Puede utilizar la función de aplicación del objeto Series :

>>> df = pd.DataFrame([['' a '', 10], ['' c '', 5]]) >>> df[0][0] '' a '' >>> df[0] = df[0].apply(lambda x: x.strip()) >>> df[0][0] ''a''

Tenga en cuenta el uso de la strip y no el regex que es mucho más rápido

Otra opción: use la función de aplicación del objeto DataFrame:

>>> df = pd.DataFrame([['' a '', 10], ['' c '', 5]]) >>> df.apply(lambda x: x.apply(lambda y: y.strip() if type(y) == type('''') else y), axis=0) 0 1 0 a 10 1 c 5


Puedes probar:

df[0] = df[0].str.strip()

o más específicamente para todas las columnas de cadena

non_numeric_columns = list(set(df.columns)-set(df._get_numeric_data().columns)) df[non_numeric_columns] = df[non_numeric_columns].apply(lambda x : str(x).strip())


Si realmente quieres usar expresiones regulares, entonces

>>> df.replace(''(^/s+|/s+$)'', '''', regex=True, inplace=True) >>> df 0 1 0 a 10 1 c 5

Pero debería ser más rápido hacerlo así:

>>> df[0] = df[0].str.strip()


def trim(x): if x.dtype == object: x = x.str.split('' '').str[0] return(x) df = df.apply(trim)