【问题标题】:Semantics of DataFrame groupby methodDataFrame groupby 方法的语义
【发布时间】:2018-05-02 00:05:18
【问题描述】:

我发现 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'])

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

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

但是,上述操作确实使用df'key1' 列创建了一个组。

怎么会这样?解释器是否将原始 DataFrame(本例中为 df)的信息与创建的 DataFrame/series(本例中为 data1)一起存储?

谢谢。

【问题讨论】:

    标签: python semantics pandas-groupby


    【解决方案1】:

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

    这主要是替代的语法糖,而且更冗长

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

    【讨论】:

    • 谢谢。我现在明白了。
    • 如果我或其他答案有帮助,请不要忘记accept 它 - 单击答案旁边的复选标记 () 将其从灰色切换为已填充。谢谢。
    • 没问题。只有我首先看到的是我的答案被接受了,所以我提到 StackOverflow 中只有一个答案应该被接受。
    【解决方案2】:

    虽然分组列通常来自相同的数据框或系列,但它们不一定是。

    您的声明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 行,以及一个使用第 2 和 3 行的组 b

    【讨论】:

    • data1.groupby(['a', 'a', 'b', 'b', 'a'])不同,与data1.groupby(pd.Series(['a', 'a', 'b', 'b', 'a']))相同
    • 不会是我第一次错了。从技术上讲,您是正确的。但在这种情况下,它的计算结果相同,不是吗?
    • 有数据对齐,所以这里是的,但如果有 2 个不同的系列,则必须先对齐索引。
    • 这就是我的观点。你可以做data1.groupby(['a', 'c', 'c', 'c', 'c']).sum(),这将返回一个以ac为索引的系列,第一个值是data1的第一行的值,c的总和由下一个的总和组成来自data1 的四个值(对应于分组的索引)。请注意,c 甚至没有出现在原始数据框中。
    • 是的,我同意,如果相同的 df 则数据对齐并且一切正常。但我认为如果系列有不同的索引,例如 - s1 = df['key1'] s1.index = s1.index * 100 s2 = df['data1'] s = s2.groupby(s1).mean()
    猜你喜欢
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多