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 elregex
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)