Python 数据帧groupby方法的语义

Python 数据帧groupby方法的语义,python,semantics,pandas-groupby,Python,Semantics,Pandas Groupby,我发现数据帧对象上的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)}) d

我发现数据帧对象上的
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'])
但是我没有,我可以在
分组
上进一步应用
均值
方法来获得预期的结果

grouped.mean()
# Out[13]: 
# key1
# a   -0.034941
# b    0.163884
# Name: data1, dtype: float64
但是,上述操作确实使用
df
'key1'
列创建了一个组

这怎么会发生?解释器是否使用创建的数据帧/序列(
data1
)存储原始数据帧的信息(本例中为
df


谢谢。

这只是语法糖,请分别按列(
系列
)选中:

这主要是另一种选择的语法糖分,而且要详细得多


尽管分组列通常来自同一数据帧或系列,但它们不必是相同的

您的语句
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行。

它与
data1.groupby(['a','a','b','b','a'])
不同,但与
data1.groupby(pd.Series(['a','a','b','b','a'))相同
这不是我第一次错了。从技术上讲,你是对的。但在这种情况下,它的计算结果是相同的,不是吗?有数据对齐,所以这里是的,但如果有两个不同的系列,则必须首先对齐索引。这是我的观点。您可以执行
data1.groupby(['a','c','c','c','c']).sum()
,它将返回一个在
a
c
上索引的序列,第一个值是
data1
中第一行的值,
c
的和由
data1
中接下来四个值的和组成(对应于分组的索引化)。注意,
c
甚至没有出现在原始数据帧中。是的,我同意,如果相同的df,那么数据是对齐的,并且所有都工作。但是我认为,如果序列具有不同的索引,比如-
s1=df['key1']
s1.index=s1.index*100
s2=df['data1']
s=s2.groupby(s1).mean()
谢谢。我现在明白了。如果我或其他答案有帮助,请不要忘记-单击复选标记(
)旁边的答案将其从灰色切换为填充。谢谢。没问题。只有我看到第一个答案才被接受,所以我提到StackOverflow中只有一个答案应该被接受。
>>> data1.groupby(['a', 'a', 'b', 'b', 'a']).groups
{'a': [0, 1, 4], 'b': [2, 3]}