2017-04-22 1 views
1

Je tente actuellement de comparer deux colonnes dans une trame de données de pandas géants:nombre de nombre d'éléments en python tableau np.where()

--------------- Cluster Assignment --------------- 
      ID  Class Cluster 
    0 1000025  2  4 
    1 1002945  2  2 
    2 1015425  2  4 
    3 1016277  2  2 
    4 1017023  2  4 
    5 1017122  4  2 
    6 1018099  2  4 
    7 1018561  2  4 
    8 1033078  2  4 
    9 1033078  2  4 
    10 1035283  2  4 
    11 1036172  2  4 
    12 1041801  4  4 
    13 1043999  2  4 
    14 1044572  4  2 
    15 1047630  4  4 
    16 1048672  2  4 
    17 1049815  2  4 
    18 1050670  4  2 
    19 1050718  2  4 

pour tenter de trouver le nombre de lignes qui ne correspondent pas à trouver le rapport des erreurs dans mon dataframe (la df complète est beaucoup plus longue que cela). J'utilise np.where() pour faire la comparaison, et je reçois une sortie précise de toutes les lignes qui sont incorrectes, mais maintenant je veux ajouter combien de lignes sont erronées, puis diviser cela par le nombre total de lignes .. mon problème est maintenant que je reçois:

>>> data= np.where(df7['Class']!=df7['Cluster']) 
>>> print(len(data)) 
1 

si j'imprimer le type de Datai obtenir < class 'tuple' >. Donc, j'ai essayé de convertir tuple à la liste en utilisant:

>>> print(list(data)) 
[array([ 9, 11, 17, 31, 32, 33, 34, 36, 38, 62, 64, 65, 135, 
    156, 196, 201, 277, 301], dtype=int64)] 

De toute évidence, ce n'est pas utile parce que si je tente d'imprimer/stocker la longueur de cette liste, je reçois

>>> print(list(data)) 
[array([ 9, 29, 30, 31, 33, 35, 59, 61, 62, 132, 153, 193, 198, 
    274, 298], dtype=int64)] 
>>> print('errors: ', len(cluster2wrong)) 
errors: 1 

Quelqu'un pourrait-il pointez-moi dans la direction de comment je peux juste compter ces articles?

+0

avez-vous essayé d'utiliser 'impression (LEN (données [0]))' sur votre premier exemple? –

+0

'data' est un tuple, un élément par dimension du tableau. 'data [0]' est un tableau, les indices d'une de ces dimensions. – hpaulj

+0

à quoi ressemble la structure de 'data'? Le convertir en quelque chose d'autre juste pour compter le nombre d'éléments qui vous intéresse semble inutile, vous pouvez juste interroger la taille de la chose que vous obtenez. Ou n'importe quelle sous-partie de ce que vous êtes réellement après. – pvg

Répondre

1

Le résultat de np.where est un tuple contenant n tableaux, où n est le nombre de dimensions dans votre tableau. La bonne nouvelle est que chacun de ces n tableaux a la même longueur (chacun représentant un « index » pour chaque article trouvé), de sorte que vous pouvez simplement utiliser la longueur de l'un d'eux:

>>> len(data[0]) # or len(data[i]) where i < dimensions of your df7 

comme déjà mentionné dans les commentaires. Toutefois, si vous voulez juste savoir combien d'éléments satisfont à la condition, vous pouvez utiliser np.count_nonzero:

>>> a = np.array([2,3,4,5]) 
>>> b = np.array([3,3,3,3]) 

>>> np.count_nonzero(a != b) 
3 
+0

Le premier exemple, 'len (data [0])' était le ticket. Maintenant, pour savoir pourquoi mon algorithme k-means me donne un taux d'erreur de 4% la moitié du temps et 95% l'autre moitié lol –

+0

En supposant que vous arrondi les valeurs 4% et 95% pourraient ajouter jusqu'à 100% (arrondi bien introduit +/- 1 c'est donc possible). Cela ne semble pas être une coïncidence. Veuillez re-vérifier vos formules pour les erreurs possibles. :) – MSeifert

+0

Je l'ai regardé environ 4 fois maintenant, ne peut toujours pas le comprendre. Aucune idée pourquoi cela fonctionne de temps en temps et pas d'autres quand rien ne change. Que ce soit bon ou mauvais, vous supposeriez qu'il ferait la même chose à chaque fois. Très étrange, en effet. –