使用大熊猫进行多变量分组操作

时间:2017-07-28 12:51:13

标签: python pandas pandas-groupby

我正在尝试从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?

2 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:1)

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