Comment obtenir les modalités sur de grandes tables sans problème de mémoire?

Bonjour,

J’utilise une fonction assez pratique pour obtenir les modalités d’un lot de table

def Nombre_valeurs_qualit(dataframe,colonne):

    print( dataframe[colonne].value_counts(),'\n')
   
def valeurs_nonuniques(tableList,tablenom):
    for row,rows in zip(tableList,tablenom):
        print ('table ',rows+'\n')    
        print (row.nunique())
        inf_elments=list(row.columns[row.nunique()<= 10])
        print (len(inf_elments)," colonne(s) de cette table sont en dessous de 7 categories :\n")
        if inf_elments:
            for col in inf_elments:
                print ("    - ",col,"\n")
                Nombre_valeurs_qualit(row,col)
            print ('\n --------------')
        else:
            print ('\n --------------')

row.nunique()>> est vraiment pratique pour cela.
Par contre dès que la table est vraiment trop grande ,j’ai un problème de mémoire…
Existe il une autre fonction qui pourrait contourner le problème?
Merci d’avance pour les infos ou lien pouvant me servir…

Bonne journée

Bonjour Benoit,

Votre problématique de mémoire est potentiellement causée par l’ensemble des boucles FOR et quelques opérations que vous effectuez en double. Les boucles FOR sont très chronophages et consommatices en mémoire.

Je vous conseille donc potentiellement de procéder en 3 étapes:

  1. Créer une série donnant le nombre de valeurs uniques par colonne d’un dataframe:
    dataframe.nunique().sort_values(ascending=False)
  2. Filtrer les noms des colonnes qui vous intéressent (typiquement avec un nombre de valeurs uniques inférieur à 10 comme dans votre exemple)
  3. Et pour les colonnes ci-dessus, afficher le décompte des modalités. (avec potentiellement une seule boucle FOR ici)

En espérant avoir répondu à votre question,
Sébastien

bonjour,

Désolé pour le délai de réponse :slight_smile: et merci pour le com.

La boucle for était faite pour scanner un schéma entier…
Mais même sans, pas moyen d’utiliser cette fonction. (la table fait 50millions de donnée).
Je vais me tourner vers des choses plus robustes…