DataFrame groupby 方法的语义

Semantics of DataFrame groupby method

我发现 groupby 方法在 DataFrame 对象上的行为出乎意料。

让我用一个例子来解释。

df = pd.DataFrame({'key1': ['a', 'a', 'b', 'b', 'a'],
                   'key2': ['one', 'two', 'one', 'two', 'one'],
                   'data1': np.random.randn(5),
                   'data2': np.random.randn(5)})
data1 = df['data1']

data1
# Out[14]: 
# 0    1.989430
# 1   -0.250694
# 2   -0.448550
# 3    0.776318
# 4   -1.843558
# Name: data1, dtype: float64

data1 不再有 'key1' 列。 因此,如果我应用以下操作,我希望得到一个错误:

grouped = data1.groupby(df['key1'])

但是我没有,我可以进一步在grouped上应用mean方法来得到预期的结果。

grouped.mean()
# Out[13]: 
# key1
# a   -0.034941
# b    0.163884
# Name: data1, dtype: float64

但是,上述操作确实使用 df'key1' 列创建了一个组。

怎么会这样?解释器是否使用创建的 DataFrame/series(在本例中为 data1)存储原始 DataFrame(在本例中为 df)的信息?

谢谢。

这只是语法糖,检查here - 单独按列选择(Series):

This is mainly syntactic sugar for the alternative and much more verbose

s = df['data1'].groupby(df['key1']).mean()
print (s)
key1
a    0.565292
b    0.106360
Name: data1, dtype: float64

虽然分组列通常来自同一个数据框或系列,但它们不一定是。

您的语句 data1.groupby(df['key1']) 等同于 data1.groupby(['a', 'a', 'b', 'b', 'a'])。事实上,您可以检查实际的组:

>>> data1.groupby(['a', 'a', 'b', 'b', 'a']).groups
{'a': [0, 1, 4], 'b': [2, 3]}

这意味着您在 data1 上的 groupby 将有一个组 a 使用来自 data1 的第 0、1 和 4 行以及一个组 b 使用第 2 行和第 3 行。