多变量分组运算

2024-10-03 04:34:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从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?你知道吗


Tags: 方法idpandasdfdatalibrary教程frame
2条回答

耶斯雷尔提到的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

您可以使用^{}

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

^{}^{}除以^{}的另一个解:

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

相关问题 更多 >