Obtenir des première et deuxième valeurs les plus élevées dans les pandas colonnes
Je suis en utilisant des pandas pour analyser certains résultats de l'élection. J'ai un DF, les Résultats, qui a une ligne pour chaque circonscription et des colonnes représentant les votes pour les différentes parties (plus de 100 d'entre eux):
In[60]: Results.columns
Out[60]:
Index(['Constituency', 'Region', 'Country', 'ID', 'Type', 'Electorate',
'Total', 'Unnamed: 9', '30-50', 'Above',
...
'WP', 'WRP', 'WVPTFP', 'Yorks', 'Young', 'Zeb', 'Party', 'Votes',
'Share', 'Turnout'],
dtype='object', length=147)
Donc...
In[63]: Results.head()
Out[63]:
Constituency Region Country ID Type \
PAID
1 Aberavon Wales Wales W07000049 County
2 Aberconwy Wales Wales W07000058 County
3 Aberdeen North Scotland Scotland S14000001 Burgh
4 Aberdeen South Scotland Scotland S14000002 Burgh
5 Aberdeenshire West & Kincardine Scotland Scotland S14000058 County
Electorate Total Unnamed: 9 30-50 Above ... WP WRP WVPTFP \
PAID ...
1 49821 31523 NaN NaN NaN ... NaN NaN NaN
2 45525 30148 NaN NaN NaN ... NaN NaN NaN
3 67745 43936 NaN NaN NaN ... NaN NaN NaN
4 68056 48551 NaN NaN NaN ... NaN NaN NaN
5 73445 55196 NaN NaN NaN ... NaN NaN NaN
Yorks Young Zeb Party Votes Share Turnout
PAID
1 NaN NaN NaN Lab 15416 0.489040 0.632725
2 NaN NaN NaN Con 12513 0.415052 0.662230
3 NaN NaN NaN SNP 24793 0.564298 0.648550
4 NaN NaN NaN SNP 20221 0.416490 0.713398
5 NaN NaN NaN SNP 22949 0.415773 0.751528
[5 rows x 147 columns]
Par circonscription les résultats pour chaque partie sont donnés dans les colonnes Results.ix[:, 'Unnamed: 9': 'Zeb']
Je peux trouver de la partie gagnante (c'est à dire la partie qui a interrogé plus grand nombre de votes) et le nombre de voix qu'il interrogé à l'aide de:
RawResults = Results.ix[:, 'Unnamed: 9': 'Zeb']
Results['Party'] = RawResults.idxmax(axis=1)
Results['Votes'] = RawResults.max(axis=1).astype(int)
Mais, j'ai aussi besoin de savoir combien de votes de la deuxième partie (et, idéalement, de son index/nom). Donc, il y a de toute façon pandas à retourner le deuxième valeur la plus élevée/index dans un ensemble de colonnes pour chaque ligne?
nlargest
.Sûrement df.nlargest(colonne) sera de retour à la n des grandes valeurs dans une colonne, alors que je veux le faire sur une ligne?
Ensuite, utilisez
transpose
?c'est une bonne direction (je suppose), mais c'est compliqué et pourrait être difficile...
OriginalL'auteur TimGJ | 2016-08-21
Vous devez vous connecter pour publier un commentaire.
Ici est un NumPy solution:
ou comme les pandas Trame de Données:
ou un solution plus rapide de @Divakar:
a[np.arange(N)[:,None],np.argpartition(-a,np.arange(2),axis=1)[:,:2]]
, oùa
est le dataframe sous forme de tableau etN
est le nombre de lignes. Ceci est basé sur stackoverflow.com/a/35416369/3293881, stackoverflow.com/a/37036444/3293881. Un peu lourd, mais juste une solution de rechange si l'OP veut de la performance, spécialement pour sélectionner juste la plus élevée de deux de nombreuses colonnes, ce doit être vraiment bon!!!merci!!!! J'ai ajouté votre solution pour la réponse
Cela fonctionne, mais seulement après que j'ai converti les NaNs à zéros.
semble bien fonctionner avec
NaNs
. Pour la conversion deNaNs
à0s
,np.where
pourrait être utilisé.Ou un hacky méthode sans avoir à les convertir pour les zéros :
-np.sort(-df.values)[:,:2]
.OriginalL'auteur MaxU
nlargest(int)
Pour obtenir la plus haute des valeurs d'une colonne, vous pouvez utiliser nlargest(), c'est à dire:
Ci-dessus permettra d'imprimer le 2 plus valeurs de la colonne
High
Vous pouvez également utiliser nsmallest() de la même façon pour obtenir le plus bas valeurs.
OriginalL'auteur Pedro Lobito
Vous pouvez simplement trier vos résultats, de telle sorte que la première ligne contient au max. Ensuite, vous pouvez simplement utiliser l'indexation pour obtenir les n premières places.
Je ne suis pas sûr que cela va fonctionner. Il n'y a aucune garantie que la valeur maximale sera toujours dans la même colonne.
J'ai mal lu votre question. Désolé pour la médiocre réponse. Je ne savais pas que chaque ligne est une circonscription, et que vous voulez le plus haut de la colonne à travers les lignes. J'ai pensé à une solution avec Numpy que ce serait plus rapide, mais je ne veux pas compliquer les choses.
OriginalL'auteur Kartik