type dtypes data column change astype python pandas na

python - data - pandas dtypes



Convertir la columna de Pandas que contiene NaNs a dtype `int` (6)

Leo datos de un archivo .csv a un marco de datos de Pandas como a continuación. Para una de las columnas, es decir, id , deseo especificar el tipo de columna como int . El problema es que la serie id tiene valores faltantes / vacíos.

Cuando trato de convertir la columna de id entero mientras leo .csv, obtengo:

df= pd.read_csv("data.csv", dtype={''id'': int}) error: Integer column has NA values

Alternativamente, traté de convertir el tipo de columna después de leer como a continuación, pero esta vez obtengo:

df= pd.read_csv("data.csv") df[[''id'']] = df[[''id'']].astype(int) error: Cannot convert NA to integer

¿Cómo puedo abordar esto?


En mi caso, he editado el formato de columna de csv, es decir, he cambiado el formato de la columna de general a número. Luego puedo cambiar el tipo en pandas.

df= pd.read_csv("data.csv") df[[''id'']] = df[[''id'']].astype(int)


La falta de representante NaN en las columnas enteras es un panda "gotcha" .

La solución habitual es simplemente usar flotadores.


Me encontré con este problema trabajando con pyspark. Como este es un frontend de python para código que se ejecuta en un jvm, requiere seguridad de tipo y usar float en lugar de int no es una opción. He pd.read_csv el problema envolviendo los pandas pd.read_csv en una función que completará las columnas definidas por el usuario con valores de relleno definidos por el usuario antes de convertirlas al tipo requerido. Esto es lo que terminé usando:

def custom_read_csv(file_path, custom_dtype = None, fill_values = None, **kwargs): if custom_dtype is None: return pd.read_csv(file_path, **kwargs) else: assert ''dtype'' not in kwargs.keys() df = pd.read_csv(file_path, dtype = {}, **kwargs) for col, typ in custom_dtype.items(): if fill_values is None or col not in fill_values.keys(): fill_val = -1 else: fill_val = fill_values[col] df[col] = df[col].fillna(fill_val).astype(typ) return df


Mi caso de uso es la pérdida de datos antes de cargar en una tabla DB:

df[col] = df[col].fillna(-1) df[col] = df[col].astype(int) df[col] = df[col].astype(str) df[col] = df[col].replace(''-1'', np.nan)

Eliminar NaNs, convertir a int, convertir a str y luego reinsertar NAN.

¡No es bonito, pero hace el trabajo!


Si puede modificar sus datos almacenados, use un valor centinela para la id faltante. Un caso de uso común, inferido por el nombre de la columna, siendo que id es un número entero, estrictamente mayor que cero, puede usar 0 como valor centinela para que pueda escribir

if row[''id'']: regular_process(row) else: special_process(row)


Suponiendo que su DateColumn formateada 3312018.0 debe convertirse a 03/31/2018 como una cadena. Y, algunos registros faltan o 0.

df[''DateColumn''] = df[''DateColumn''].astype(int) df[''DateColumn''] = df[''DateColumn''].astype(str) df[''DateColumn''] = df[''DateColumn''].apply(lambda x: x.zfill(8)) df.loc[df[''DateColumn''] == ''00000000'',''DateColumn''] = ''01011980'' df[''DateColumn''] = pd.to_datetime(df[''DateColumn''], format="%m%d%Y") df[''DateColumn''] = df[''DateColumn''].apply(lambda x: x.strftime(''%m/%d/%Y''))