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 行。
我发现 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 行。