我正在尝试从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?
答案 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.prod
和GroupBy.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)
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