StringDtype par défaut dans Pandas 3.0
Pandas 3.0 change le comportement par défaut pour les colonnes textuelles : elles utilisent désormais StringDtype au lieu de object. Le backend PyArrow est utilisé pour le stockage, offrant une meilleure gestion de la mémoire et des performances accrues sur les opérations textuelles.
Ce qui change
Avant Pandas 3.0, les colonnes contenant du texte étaient stockées comme object (des pointeurs Python). Désormais, elles sont stockées nativement comme string[pyarrow_numpy], plus compact et plus rapide.
import pandas as pd
df = pd.DataFrame({
'nom': ['Alice', 'Bob', 'Charlie'],
'ville': ['Paris', 'Lyon', 'Marseille'],
})
# Pandas 2.x : dtype object
# Pandas 3.0 : dtype string (PyArrow backend)
print(df.dtypes)
# nom string[pyarrow_numpy]
# ville string[pyarrow_numpy]
# Les valeurs manquantes utilisent pd.NA au lieu de None/NaN
df.loc[1, 'nom'] = pd.NA
print(df['nom'].isna()) # [False, True, False]
print(type(df.loc[1, 'nom'])) # <class 'pandas._libs.missing.NAType'>
Performances
Le backend PyArrow stocke les chaînes de manière contiguë en mémoire, réduisant la consommation mémoire de 30 à 50 % pour les DataFrames textuels. Les opérations comme .str.contains() sont aussi significativement plus rapides.
import pandas as pd
import numpy as np
# Comparaison mémoire sur 1 million de lignes
n = 1_000_000
noms = [f'utilisateur_{i}' for i in range(n)]
# Avec object dtype (ancien)
s_object = pd.Series(noms, dtype='object')
print(f"object : {s_object.memory_usage(deep=True) / 1e6:.1f} Mo")
# Avec StringDtype PyArrow (nouveau défaut)
s_string = pd.Series(noms, dtype='string[pyarrow_numpy]')
print(f"string : {s_string.memory_usage(deep=True) / 1e6:.1f} Mo")
# Réduction typique : ~40% de mémoire en moins
# Les opérations textuelles sont plus rapides
resultat = s_string.str.startswith('utilisateur_99')
print(f"Correspondances : {resultat.sum()}")
