web-dev-qa-db-fra.com

Recherche du nombre d'éléments distincts dans DataFrame dans chaque colonne

J'essaie de trouver le nombre de valeurs distinctes dans chaque colonne à l'aide de pandas. C'est ce que j'ai fait.

import pandas as pd
import numpy as np

# Generate data.
NROW = 10000
NCOL = 100
df = pd.DataFrame(np.random.randint(1, 100000, (NROW, NCOL)),
                  columns=['col' + x for x in np.arange(NCOL).astype(str)])

Je dois compter le nombre d'éléments distincts pour chaque colonne, comme ceci:

col0    9538
col1    9505
col2    9524

Quel serait le moyen le plus efficace de le faire, car cette méthode sera appliquée aux fichiers dont la taille est supérieure à 1,5 Go?


D'après les réponses, df.apply(lambda x: len(x.unique())) est le plus rapide ( notebook ).

%timeit df.apply(lambda x: len(x.unique())) 10 loops, best of 3: 49.5 ms per loop %timeit df.nunique() 10 loops, best of 3: 59.7 ms per loop %timeit df.apply(pd.Series.nunique) 10 loops, best of 3: 60.3 ms per loop %timeit df.T.apply(lambda x: x.nunique(), axis=1) 10 loops, best of 3: 60.5 ms per loop

22
ajknzhol

À partir de pandas 0,20, nous pouvons utiliser nunique directement sur DataFrames, c'est-à-dire:

df.nunique()
a    4
b    5
c    1
dtype: int64

Autres options d'héritage:

Vous pouvez faire une transposition du df puis utiliser apply call nunique row-wise:

In [205]:
df = pd.DataFrame({'a':[0,1,1,2,3],'b':[1,2,3,4,5],'c':[1,1,1,1,1]})
df

Out[205]:
   a  b  c
0  0  1  1
1  1  2  1
2  1  3  1
3  2  4  1
4  3  5  1

In [206]:
df.T.apply(lambda x: x.nunique(), axis=1)

Out[206]:
a    4
b    5
c    1
dtype: int64

MODIFIER

Comme l'a souligné @ajcr, la transposition est inutile:

In [208]:
df.apply(pd.Series.nunique)

Out[208]:
a    4
b    5
c    1
dtype: int64
30
EdChum

Déjà quelques bonnes réponses ici :) mais celle-ci semble manquer:

df.apply(lambda x: x.nunique())

À partir des pandas 0.20.0, DataFrame.nunique() est également disponible.

4

Un Pandas.Series a une fonction .value_counts() qui fournit exactement ce que vous voulez. Consultez la documentation de la fonction .

2
CaMaDuPe85

Récemment, j'ai eu les mêmes problèmes de comptage de la valeur unique de chaque colonne dans DataFrame et j'ai trouvé une autre fonction plus rapide que la fonction apply:

#Select the way how you want to store the output, could be pd.DataFrame or Dict, I will use Dict to demonstrate:
col_uni_val={}
for i in df.columns:
    col_uni_val[i] = len(df[i].unique())

#Import pprint to display dic nicely:
import pprint
pprint.pprint(col_uni_val)

Cela fonctionne pour moi presque deux fois plus vite que df.apply(lambda x: len(x.unique()))

0
Wendao Liu
df.apply(lambda x: len(x.unique()))
0
zehai