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*100s2=df['data1']
s=s2.groupby(s1).mean()
谢谢。我现在明白了。如果我或其他答案有帮助,请不要忘记-单击复选标记(✓代码>)旁边的答案将其从灰色切换为填充。谢谢。没问题。只有我看到第一个答案才被接受,所以我提到StackOverflow中只有一个答案应该被接受。
>>> data1.groupby(['a', 'a', 'b', 'b', 'a']).groups
{'a': [0, 1, 4], 'b': [2, 3]}