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')
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 2Dans [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
@shankararul voir: https://github.com/pandas-dev/pandas/issues/15297
Commentaire le plus utile
@shankararul voir: https://github.com/pandas-dev/pandas/issues/15297