我在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,但我仍不清楚为什么只引用第一个子集: