2 votes

pandas.DataFrame.convert_dtypes avec HDFStore conduit à une erreur d'attribut ?

Je veux convertir les dtypes de mon df par convert_dtypes mais si je veux ensuite le stocker via HDFStore j'obtiens ceci : AttributeError : L'objet 'IntegerArray' ne possède pas d'attribut 'size'.

df = pd.DataFrame()
df["test"] = [0,1,2,3]
df["test1"] = [0,1,2,3.5]
df = dfdf.convert_dtypes()
store=pd.HDFStore(r"C:\Users\User\Desktop\test.h5")
store["test"] = df
store.close()

2voto

Olivier Points 101

J'ai rencontré le même problème. IntegerArrays a la propriété que les NaNs peuvent être représentés (comme par exemple float64), ce qui n'est pas possible avec les types de données int normaux de numpy dans pandas. Cependant, cela entraîne l'échec de ce type de données lors de l'écriture dans HDF. Voir ici ( https://github.com/pandas-dev/pandas/issues/26144 ). Si vous n'avez pas de NaN dans vos colonnes, voici une solution simple et rapide :

cols = df.columns
for col in cols:
    col_dtype = df[col].dtype 
    try:               
        if col_dtype == pd.Int8Dtype():
            df[col] = df[col].astype('int8')
        elif col_dtype == pd.Int16Dtype():
            df[col] = df[col].astype('int16')
        elif col_dtype == pd.Int32Dtype():
            df[col] = df[col].astype('int32')    
        elif col_dtype == pd.Int64Dtype():
            df[col] = df[col].astype('int64')
    except:
        pass

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X