【问题标题】:Multivariate Grouped Operation with pandas使用 pandas 进行多变量分组操作
【发布时间】:2017-07-28 12:51:12
【问题描述】:

我正在尝试从 R 的 dplyr 切换到 Python 中的 pandas。我已经通过几个教程来学习基础知识,但我被困在一项任务上。我想在 groupby 中使用 agg 方法对多个列执行操作。这是 R 中的一项微不足道的任务,如下例所示:

library(dplyr)

DF <- data.frame('ID'=c(1, 1, 1, 2, 2, 2),
                 'A'=c(1, 2, 3, 4, 5, 6),
                 'B'=c(2, 4, 6, 8, 10, 12))

IDgp <- group_by(DF, ID) %>%
  summarise(C = prod(B) / sum(A))


### # Output:
### 
### > DF
###   ID A  B
### 1  1 1  2
### 2  1 2  4
### 3  1 3  6
### 4  2 4  8
### 5  2 5 10
### 6  2 6 12
###
### > IDgp
### # A tibble: 2 x 2
###      ID     C
###   <dbl> <dbl>
### 1     1     8
### 2     2    64

在此示例中,我在 DF 中的 ID 列上进行分组,并基于 A 和 B 列创建一个任意新变量。有没有一种直接的方法可以使用 pandas 将此示例转换为 Python?

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    你可以使用GroupBy.apply:

    df = df.groupby('ID').apply(lambda x: x['B'].prod() / x['A'].sum()).reset_index(name='C')
    print (df)
       ID     C
    0   1   8.0
    1   2  64.0
    

    GroupBy.prodGroupBy.sum 的另一种解决方案,除以 Series.div

    g = df.groupby('ID')
    df = g['B'].prod().div(g['A'].sum()).reset_index(name='C')
    print (df)
       ID     C
    0   1   8.0
    1   2  64.0
    

    等同于:

    df = df.groupby('ID')['B'].prod().div(df.groupby('ID')['A'].sum()).reset_index(name='C')
    print (df)
       ID     C
    0   1   8.0
    1   2  64.0
    

    【讨论】:

    • 这太好了,谢谢。第一种方法特别容易理解。看起来 apply 方法可能比 agg 方法更灵活。
    • 是的,完全正确。 agg 分别处理每一列 (Series),因此无法在此解决方案中使用。
    【解决方案2】:

    jezrael 提到的apply 方法是可行的方法。

    或者,如果您想存储中间结果并通过链接分配新值,您可以使用.agg.assign

    In [251]: df.groupby('ID').agg({'A': 'sum', 'B': 'prod'}).assign(C=lambda x: x.B/x.A)
    Out[251]:
         A    B     C
    ID
    1    6   48   8.0
    2   15  960  64.0
    

    【讨论】:

    • 我想我希望 .agg 更灵活。但我也喜欢这个。这是一种干净的方法。
    猜你喜欢
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    相关资源
    最近更新 更多