La función siguiente se ha implementado incorrectamente. Si el marco tiene un índice con valores duplicados, obtendrá un resultado con más de n
filas y no ordenadas correctamente. Entonces nsmallest
y nlargest
para DataFrame no devuelven un marco correcto en este 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')
Por supuesto:
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 al margen de
¿Interesado en hacer un PR para solucionar este problema?
Sí, lo arreglaré pronto
Perdón por el ejemplo
Le 9 juin 2016 à 23:30, Joris Van den Bossche [email protected] a écrit:
Por supuesto:
En [71]: df = pd.DataFrame ({'a': [1,2,3,4], 'b': [4,3,2,1]}, index = [0,0,1, 1])
En [72]: df.nlargest (1, 'a')
Fuera [72]:
ab
1 4 1
1 3 2En [73]: df.nlargest (2, 'a')
Fuera [73]:
ab
1 4 1
1 4 1
1 3 2
1 3 2
( Nota al margen de
¿Interesado en hacer un PR para solucionar este problema?-
Recibes esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub o silencie el hilo.
mi solución no es muy elegante, pero no veo ninguna otra solución para lidiar con MultiIndex y el índice de valor duplicado
La suma parece funcionar bien en .19.2 Pero con el recuento, no parece tener sentido. El gl se repite tantas veces como la "n". ¿Es un error o estoy haciendo algo 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 ver: https://github.com/pandas-dev/pandas/issues/15297
Comentario más útil
@shankararul ver: https://github.com/pandas-dev/pandas/issues/15297