在班级内对熊猫使用inplace = True和sort_values值时出现错误

时间:2019-02-06 05:22:47

标签: python pandas oop

我在python 3.7类中使用带有参数sort_values的熊猫inplace=True时遇到了一个非常不寻常的极端情况,我想知道这是功能还是bug /如果有人可以解释为什么会这样。考虑以下玩具示例:

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相对应的第一个子集回收3次。

在上面的函数中,当我们更改哪一行时,我们将其注释掉,以使我们现在调用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,但是这样做会导致操作失败。感觉这里至少应该有一个错误或警告。

有什么想法吗? This looks like a good start,但我仍不清楚为什么只引用第一个子集:

0 个答案:

没有答案