Pandas: BUG: in _nsorted pour trame avec index de valeurs dupliquées

Créé le 9 juin 2016  ·  5Commentaires  ·  Source: pandas-dev/pandas

La fonction ci-dessous n'a pas été correctement implémentée. Si le cadre a un index avec des valeurs dupliquées, vous obtiendrez un résultat avec plus de n lignes et pas correctement trié. Donc nsmallest et nlargest pour DataFrame ne retournent pas une image correcte dans ce cas particulier.

def _nsorted(self, columns, n, method, keep):
    if not com.is_list_like(columns):
        columns = [columns]
    columns = list(columns)
    ser = getattr(self[columns[0]], method)(n, keep=keep)
    ascending = dict(nlargest=False, nsmallest=True)[method]
    return self.loc[ser.index].sort_values(columns, ascending=ascending,
                                           kind='mergesort')
Bug

Commentaire le plus utile

Tous les 5 commentaires

En effet:

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

In [72]: df.nlargest(1, 'a')
Out[72]:
   a  b
1  4  1
1  3  2

In [73]: df.nlargest(2, 'a')
Out[73]:
   a  b
1  4  1
1  4  1
1  3  2
1  3  2

( @ Note latérale
Intéressé à faire un PR pour résoudre ce problème?

Oui je vais réparer ça bientôt
Désolé pour l'exemple

Le 9 juin 2016 à 23:30, Joris Van den Bossche [email protected] a écrit:

En effet:

Dans [71]: df = pd.DataFrame ({'a': [1,2,3,4], 'b': [4,3,2,1]}, index = [0,0,1, 1])

Dans [72]: df.nlargest (1, 'a')
Sortie [72]:
un B
1 4 1
1 3 2

Dans [73]: df.nlargest (2, 'a')
Sortie [73]:
un B
1 4 1
1 4 1
1 3 2
1 3 2
( @ Note latérale
Intéressé à faire un PR pour résoudre ce problème?

-
Vous recevez cela parce que vous avez été mentionné.
Répondez directement à cet e-mail, affichez-le sur GitHub ou désactivez le fil de discussion.

mon correctif n'est pas très élégant mais je ne vois aucune autre solution pour gérer MultiIndex et index de valeur dupliqué

Sum semble bien fonctionner en .19.2 Mais avec le nombre, cela ne semble pas logique. Le df est répété autant de fois que le "n". Est-ce un bug ou est-ce que je fais quelque chose de mal?

df.groupby(['a']).agg({'b':'count'}).nlargest(2, 'b')

    b
a   
1   1
2   1
3   1
4   1
1   1
2   1
3   1
4   1
Cette page vous a été utile?
0 / 5 - 0 notes