Я столкнулся с тем, что выглядит как очень необычный угловой случай, когда использовал 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
для каждого подмножества, но что-то в этом случае вызывает сбой операции.Похоже, здесь должно быть хотя бы сообщение об ошибке или предупреждение.
Есть мысли о том, что происходит? Это похоже на хорошее начало , но я до сих пор не понимаю, почему ссылаются только на первое подмножество: