Python

Réduire la mémoire d'un DataFrame (downcast + category)

Downcast des entiers/flottants et conversion des colonnes texte répétitives en category : division par 5 à 10 de l'empreinte mémoire.

Cas d'usage

Charger des fichiers de plusieurs Go sur un poste de travail standard.

Prérequis

Python 3.9+, pandas

Python
import pandas as pd

def optimize(df: pd.DataFrame) -> pd.DataFrame:
    before = df.memory_usage(deep=True).sum() / 1e6
    for col in df.select_dtypes("int64"):
        df[col] = pd.to_numeric(df[col], downcast="integer")
    for col in df.select_dtypes("float64"):
        df[col] = pd.to_numeric(df[col], downcast="float")
    for col in df.select_dtypes("object"):
        if df[col].nunique() / len(df) < 0.5:   # faible cardinalité
            df[col] = df[col].astype("category")
    after = df.memory_usage(deep=True).sum() / 1e6
    print(f"{before:.1f} Mo -> {after:.1f} Mo")
    return df

Résultat

245.3 Mo -> 38.7 Mo

>>> df.dtypes
id_client        int32
montant        float32
categorie     category
region        category
dtype: object
PandasMémoirecategoryOptimisation

Snippets liés

Retour au Data Lab