Приведенная ниже функция была реализована некорректно. Если фрейм имеет индекс с повторяющимися значениями, вы получите результат с более чем n
строками, которые не отсортированы должным образом. Таким образом, nsmallest
и nlargest
для DataFrame не возвращают правильный кадр в этом конкретном случае.
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')
В самом деле:
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
( Примечание @ Tux1 для дальнейшего использования, всегда
Хотите сделать пиар, чтобы исправить это?
Да, я скоро это исправлю
Извините за пример
Ле 9 июн 2016 в 23:30, Йорис Ван ден Босше [email protected] автор:
В самом деле:
В [71]: df = pd.DataFrame ({'a': [1,2,3,4], 'b': [4,3,2,1]}, index = [0,0,1, 1])
В [72]: df.nlargest (1, 'a')
Из [72]:
ab
1 4 1
1 3 2В [73]: df.nlargest (2, 'a')
Из [73]:
ab
1 4 1
1 4 1
1 3 2
1 3 2
( Примечание @ Tux1 для дальнейшего использования, всегда
Хотите сделать пиар, чтобы исправить это?-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub или отключите чат.
мое исправление не очень элегантно, но я не вижу другого решения для работы с MultiIndex и индексом повторяющихся значений
Sum, кажется, работает нормально в .19.2, но со счетом это не имеет смысла. Df повторяется столько раз, сколько "n". Это ошибка или я что-то делаю не так?
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 см .: https://github.com/pandas-dev/pandas/issues/15297
Самый полезный комментарий
@shankararul см .: https://github.com/pandas-dev/pandas/issues/15297