Comment forcer pandas read csv à utiliser float32 pour toutes les colonnes float?

Parce que

  • je n'ai pas besoin de double précision
  • Mon ordinateur a une mémoire limitée et je veux traiter de plus grands ensembles de données
  • j'ai besoin de passer les données extraites (sous forme de matrice) aux bibliothèques BLAS, et les appels de BLAS pour une précision simple sont 2 fois plus rapides que pour l'équivalence de double précision.

notez que toutes les colonnes du fichier csv brut n'ont pas de type float. J'ai seulement besoin de définir float32 comme valeur par défaut pour les colonnes float.

9
demandé sur Fabian 2015-05-28 02:02:39

1 réponses

Essaie:

import numpy as np
import pandas as pd

# Sample 100 rows of data to determine dtypes.
df_test = pd.read_csv(filename, nrows=100)

float_cols = [c for c in df_test if df_test[c].dtype == "float64"]
float32_cols = {c: np.float32 for c in float_cols}

df = pd.read_csv(filename, engine='c', dtype=float32_cols)

cette première lecture d'un échantillon de 100 lignes de données (modifier au besoin) pour déterminer le type de chaque colonne.

il crée une liste de ces colonnes qui sont 'float64', puis utilise la compréhension du dictionnaire pour créer un dictionnaire avec ces colonnes comme les clés et 'np.float32' comme valeur pour chaque touche.

enfin, il lit l'ensemble du fichier en utilisant le moteur ' c ' (nécessaire pour assigner des dtypes aux colonnes) et passe ensuite le float32_cols dictionary comme paramètre de dtype.

df = pd.read_csv(filename, nrows=100)
>>> df
   int_col  float1 string_col  float2
0        1     1.2          a     2.2
1        2     1.3          b     3.3
2        3     1.4          c     4.4

>>> df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 3 entries, 0 to 2
Data columns (total 4 columns):
int_col       3 non-null int64
float1        3 non-null float64
string_col    3 non-null object
float2        3 non-null float64
dtypes: float64(2), int64(1), object(1)

df32 = pd.read_csv(filename, engine='c', dtype={c: np.float32 for c in float_cols})
>>> df32.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 3 entries, 0 to 2
Data columns (total 4 columns):
int_col       3 non-null int64
float1        3 non-null float32
string_col    3 non-null object
float2        3 non-null float32
dtypes: float32(2), int64(1), object(1)
8
répondu Alexander 2015-05-28 14:36:59