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
À partir de pandas 0,20, nous pouvons utiliser nunique
directement sur DataFrame
s, 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
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.
Un Pandas.Series
a une fonction .value_counts()
qui fournit exactement ce que vous voulez. Consultez la documentation de la fonction .
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()))
df.apply(lambda x: len(x.unique()))