DataFrame groupby方法的语义

时间:2017-11-18 07:38:09

标签: python semantics pandas-groupby

我发现DataFrame对象上的groupby方法的行为是意外的。

让我用一个例子来解释。

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'])

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

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

但是,上述操作确实使用'key1'的{​​{1}}列创建了一个组。

这怎么可能发生?解释器是否使用创建的DataFrame / series(在这种情况下为df)存储原始DataFrame(在本例中为df)的信息?

谢谢。

2 个答案:

答案 0 :(得分:1)

这只是语法糖,检查here - 按列(Series)分别进行选择:

  

这主要是替代的语法糖和更冗长的

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

答案 1 :(得分:0)

虽然分组列通常来自相同的数据框或系列,但它们并非必须如此。

您的陈述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]}

这意味着groupby data1上的a将使用来自data1的行0,1和4以及使用b组的{{1}}组第2行和第3行。