Quiero verificar si las columnas en un marco de datos consisten en cadenas para poder etiquetarlas con números con fines de aprendizaje automático. Algunas columnas consisten en números, no quiero cambiarlos. El ejemplo de columnas se puede ver a continuación:
TRAIN FEATURES Age Level 32.0 Silver 61.0 Silver 66.0 Silver 36.0 Gold 20.0 Silver 29.0 Silver 46.0 Silver 27.0 Silvergracias =)
Tenga en cuenta que las respuestas anteriores incluirán DateTime, TimeStamp, Category y otros tipos de datos.
Usar object es más restrictivo (aunque no estoy seguro de si otros dtypes también serían de object dtype):
Crear el marco de datos:
df = pd.DataFrame({ 'a': ['a','b','c','d'], 'b': [1, 'b', 'c', 2], 'c': [np.nan, 2, 3, 4], 'd': ['A', 'B', 'B', 'A'], 'e': pd.to_datetime('today')}) df['d'] = df['d'].astype('category')Eso se verá así:
abcde 0 a 1 NaN A 2018-05-17 1 bb 2.0 B 2018-05-17 2 cc 3.0 B 2018-05-17 3 d 2 4.0 A 2018-05-17 Puede verificar los tipos llamando a dtypes :
df.dtypes a object b object c float64 d category e datetime64[ns] dtype: object Puede enumerar las columnas de cadenas utilizando el método items() y filtrando por object :
> [ col for col, dt in df.dtypes.items() if dt == object] ['a', 'b']O puede usar select_dtypes para mostrar un marco de datos con solo las cadenas:
df.select_dtypes(include=[object]) ab 0 a 1 1 bb 2 cc 3 d 2Si es posible. usas dtype
import pandas as pd import numpy as np df = pd.DataFrame({'a': ['a','b','c','d']}) if df['a'].dtype != np.number: print('yes') else: print('no') También puede seleccionar sus columnas por tipo de d usando select_dtypes
df_subset = df.select_dtypes(exclude=[np.number]) # Now apply you can label encode your df_subset4 años desde la creación de esta pregunta y creo que todavía no hay una respuesta definitiva.
No creo que las cadenas hayan sido consideradas ciudadanos de primera clase en Pandas (incluso >= 1.0.0). Como ejemplo:
import pandas as pd import datetime df = pd.DataFrame({ 'str': ['a', 'b', 'c', None], 'hete': [1, 2.0, datetime.datetime.utcnow(), None] }) string_series = df['str'] print(string_series.dtype) print(pd.api.types.is_string_dtype(string_series.dtype)) heterogenous_series = df['hete'] print(heterogenous_series.dtype) print(pd.api.types.is_string_dtype(heterogenous_series.dtype))huellas dactilares
object True object True por lo tanto, aunque hete no contiene cadenas explícitas, se considera una serie de cadenas.
Después de leer la documentación , creo que la única forma de asegurarse de que una serie contenga solo cadenas es:
def is_string_series(s : pd.Series): if isinstance(s.dtype, pd.StringDtype): # The series was explicitly created as a string series (Pandas>=1.0.0) return True elif s.dtype == 'object': # Object series, check each value return all((v is None) or isinstance(v, str) for v in s) else: return False