在python pandas中替换mutate(dplyr包)

时间:2016-12-14 16:46:35

标签: python r pandas dplyr

是否有一个类似于mutate(dplyr)的函数,使用该函数我可以通过在分组数据的一列上应用函数来在分组数据上添加新列?以下是问题的详细解释:

我使用以下代码生成了样本数据

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)

所以我的问题是我如何使用pandas在Python中完成它。我试过跟随,但它不起作用

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

2 个答案:

答案 0 :(得分:5)

您想使用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 :(得分:0)

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

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)]