Pandas: ОШИБКА: в _nsorted для фрейма с индексом повторяющихся значений

Созданный на 9 июн. 2016  ·  5Комментарии  ·  Источник: pandas-dev/pandas

Приведенная ниже функция была реализована некорректно. Если фрейм имеет индекс с повторяющимися значениями, вы получите результат с более чем 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')

Самый полезный комментарий

Все 5 Комментарий

В самом деле:

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
Была ли эта страница полезной?
0 / 5 - 0 рейтинги