在Python pandas中替代dplyr包中的mutate函数

6
有没有类似于R的dplyr :: mutate()的Python pandas函数,可以通过在分组数据的一列上应用函数来向分组数据添加新列?以下是问题的详细说明:
我使用以下代码生成样本数据:
x <- data.frame(country = rep(c("US", "UK"), 5), state = c(letters[1:10]), pop=sample(10000:50000,10))

现在,我想添加一个新的列,该列具有美国和英国的最大人口。我可以使用以下R代码完成...
x <- group_by(x, country)
x <- mutate(x,max_pop = max(pop))
x <- arrange(x, country)

...或者等价地,使用R的dplyr管道运算符:

x %>% group_by(country) %>% mutate(max_pop = max(pop)) %>% arrange(country)

我的问题是如何使用pandas在Python中实现它?我尝试了以下代码,但无效。

x['max_pop'] = x.groupby('country').pop.apply(max)

2
没有管道符?dplyr的一个标志性方法:x %>% group_by(country) %>% mutate(max_pop = max(pop)) %>% arrange(country)...某个R程序员可能会有点难过! - Parfait
1
是的,但我感觉不使用管道操作符更舒适。 - saurav shekhar
1
我明白。你会慢慢理解的。起初,我讨厌 R 的 apply 系列函数。只要让我用我的 forwhile 循环就好了。它们太难理解和编写了。现在我喜欢 lapply、mapply、vapply、sapply 这些方法,这是 Python 的 pandas 缺少的(没有自定义解决方案的情况下)。 - Parfait
1
但是应用函数相对于forwhile循环提供了一些严重的性能优势。它们更快。我不确定管道是否比传统方法更快。请告诉我管道是否比传统方法更快 - saurav shekhar
1
这实际上是一个误称。Apply函数本质上只是循环,即语法糖。它们并不总是比传统的循环更有优势。我喜欢它们,因为它们返回与输入长度相等的列表/向量/矩阵,而其他循环不一定返回对象。 - Parfait
显示剩余2条评论
2个回答

9

你想使用transformtransform会返回一个与所分组的对象具有相同索引的对象,因此如果它是一个数据帧,则很容易将其分配回作为该对象中的新列。

x['max_pop'] = x.groupby('country').pop.transform('max')

安装设置

import pandas as pd 

x = pd.DataFrame(dict(
    country=['US','UK','US','UK'],
    state=['a','b','c','d'],
    pop=[37088, 46987, 17116, 20484]
))

1

我一直在将数据包(如dplyr、tidyr、tibble等)从R移植到Python:

https://github.com/pwwang/datar

如果您熟悉R语言中的那些包并希望在Python中应用它们,则这里为您提供了相关信息:

>>> from datar.all import (
...     c, f, tibble, rep, letters, sample, group_by, mutate, arrange, max
... )
>>> 
>>> x = tibble(
...   country=rep(c("US", "UK"), 5), 
...   state=c(letters[:10]), 
...   pop=sample(f[10000:50000], 10)
... )
>>> 
>>> x >> group_by(f.country) >> mutate(max_pop=max(f.pop)) >> arrange(f.country)
   country    state     pop  max_pop
  <object> <object> <int64>  <int64>
0       UK        b   48496    49290
1       UK        d   49290    49290
2       UK        f   46748    49290
3       UK        h   43078    49290
4       UK        j   20552    49290
5       US        a   29046    45070
6       US        c   22936    45070
7       US        e   44238    45070
8       US        g   12995    45070
9       US        i   45070    45070

[Groups: country (n=2)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接