Ошибка при использовании inplace = True с sort_values ​​для панд внутри класса - PullRequest
0 голосов
/ 06 февраля 2019

Я столкнулся с тем, что выглядит как очень необычный угловой случай, когда использовал pandas sort_values с аргументом inplace=True в классе Python 3.7, и мне интересно, является ли это функцией или ошибкой / если кто-то может объяснитьпочему это происходит.Рассмотрим следующий игрушечный пример:

import pandas as pd

df = pd.DataFrame({'group_column': ['A'] * 5 + ['B'] * 4 + ['C'] * 3, 'value_column': [x for x in range(12)]})


class Example:

    @staticmethod
    def foo(df_subset):
        # df_subset = df_subset.sort_values('value_column')
        df_subset.sort_values('value_column', inplace=True)
        return sum(df_subset['value_column'])

    def bar(self, df):
        return df.groupby('group_column').apply(self.foo)

test = Example()
test.bar(df)

Это приводит к выводу:

group_column
A    10
B    10
C    10
dtype: int64

Что явно неверно: только подраздел данных, соответствующий группе A, имеет value_column сумма 10. Кажется, что то, что мы здесь делаем, заставляет комбо groupby / apply перерабатывать первое подмножество, соответствующее A, три раза.

В приведенной выше функции, когда мы изменяем, какую строку мы закомментируем так, что теперь мы вызываем df_subset = df_subset.sort_values('value_column') вместо df_subset.sort_values('value_column', inplace=True), метод bar класса Example теперь возвращает:

group_column
A    10
B    26
C    30
dtype: int64

, что является правильным результатом.

Я бы подумал, что первая реализация просто переупорядочит df_subset во внутренней среде foo для каждого подмножества, но что-то в этом случае вызывает сбой операции.Похоже, здесь должно быть хотя бы сообщение об ошибке или предупреждение.

Есть мысли о том, что происходит? Это похоже на хорошее начало , но я до сих пор не понимаю, почему ссылаются только на первое подмножество:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...