web-dev-qa-db-fra.com

Trouver des valeurs uniques dans un Pandas dataframe, quel que soit l'emplacement de la ligne ou de la colonne

J'ai un Pandas dataframe et je veux trouver toutes les valeurs uniques dans ce dataframe ... indépendamment de la rangée/des colonnes. Si j'ai un dataframe 10 x 10, et supposons qu'ils en ont 84 uniques valeurs, je dois les trouver - Pas le compte.

Je peux créer un ensemble et ajouter les valeurs de chaque ligne en effectuant une itération sur les lignes du cadre de données. Mais, je pense que cela peut être inefficace (ne peut pas justifier cela). Y a-t-il un moyen efficace de le trouver? Y a-t-il une fonction prédéfinie?

50
user1717931
In [1]: df = DataFrame(np.random.randint(0,10,size=100).reshape(10,10))

In [2]: df
Out[2]: 
   0  1  2  3  4  5  6  7  8  9
0  2  2  3  2  6  1  9  9  3  3
1  1  2  5  8  5  2  5  0  6  3
2  0  7  0  7  5  5  9  1  0  3
3  5  3  2  3  7  6  8  3  8  4
4  8  0  2  2  3  9  7  1  2  7
5  3  2  8  5  6  4  3  7  0  8
6  4  2  6  5  3  3  4  5  3  2
7  7  6  0  6  6  7  1  7  5  1
8  7  4  3  1  0  6  9  7  7  3
9  5  3  4  5  2  0  8  6  4  7

In [13]: Series(df.values.ravel()).unique()
Out[13]: array([9, 1, 4, 6, 0, 7, 5, 8, 3, 2])

Numpy unique sort, il est donc plus rapide de le faire de cette façon (et ensuite de trier si vous en avez besoin)

In [14]: df = DataFrame(np.random.randint(0,10,size=10000).reshape(100,100))

In [15]: %timeit Series(df.values.ravel()).unique()
10000 loops, best of 3: 137 ᄉs per loop

In [16]: %timeit np.unique(df.values.ravel())
1000 loops, best of 3: 270 ᄉs per loop
74
Jeff

Ou vous pouvez utiliser:

df.stack().unique()

Ensuite, vous n'avez pas à vous inquiéter si vous avez NaN valeurs, car elles sont exclues lors de l'empilement.

7
user1506145