我发现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
)的信息?
谢谢。
答案 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行。