A função abaixo foi implementada incorretamente. Se o quadro tiver um índice com valores duplicados, você obterá um resultado com mais de n
linhas e não classificado corretamente. Portanto, nsmallest
e nlargest
para DataFrame não retorna um quadro correto neste caso particular.
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')
De fato:
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
( Nota lateral
Interessado em fazer uma RP para consertar isso?
Sim, vou consertar isso em breve
Desculpe pelo exemplo
Em 9 de junho de 2016 às 23:30, Joris Van den Bossche [email protected] a écrit:
De fato:
Em [71]: df = pd.DataFrame ({'a': [1,2,3,4], 'b': [4,3,2,1]}, índice = [0,0,1, 1])
Em [72]: df.nlargest (1, 'a')
Fora [72]:
ab
1 4 1
1 3 2Em [73]: df.nlargest (2, 'a')
Fora [73]:
ab
1 4 1
1 4 1
1 3 2
1 3 2
( Nota lateral
Interessado em fazer uma RP para consertar isso?-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub ou ignore a conversa.
minha correção não é muito elegante, mas não vejo nenhuma outra solução para lidar com MultiIndex e índice de valor duplicado
A soma parece funcionar bem em .19.2 Mas com a contagem, não parece fazer sentido. O df é repetido tantas vezes quanto o "n". Isso é um bug ou estou fazendo algo errado?
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 consulte: https://github.com/pandas-dev/pandas/issues/15297
Comentários muito úteis
@shankararul consulte: https://github.com/pandas-dev/pandas/issues/15297