R group_by%>%汇总了熊猫中的等价物

时间:2018-01-25 11:23:55

标签: r python-3.x pandas

我试图将一些代码从R重写为python。

我的df就像是

size = 20
np.random.seed(456)
df = pd.DataFrame({"names": np.random.choice(["bob", "alb", "jr"], size=size, replace=True),
                  "income": np.random.normal(size=size, loc=1000, scale=100),
                  "costs": np.random.normal(size=size, loc=500, scale=100),
                   "date": np.random.choice(pd.date_range("2018-01-01", "2018-01-06"),
                                           size=size, replace=True)
                  })

现在我需要按名称对df进行分组,然后执行一些汇总操作。

在R,dplyr中,我正在做

 dfg <- group_by(df, names) %>%
    summarise(
            income.acc = sum(income),
            costs.acc = sum(costs),
            net = sum(income) - sum(costs),
            income.acc.bymax = sum(income[date==max(date)]),
            cost.acc.bymax = sum(costs[date==max(date)]),
            growth =  income.acc.bymax + cost.acc.bymax - net
    )

请注意,我只是试图说明我的数据,但这并不意味着什么。

如何使用pandas获得相同的结果?

我很难过,因为df.groupby()。agg()非常有限!

使用R我得到:

> print(dfg)
# A tibble: 3 x 7
  names income.acc costs.acc   net income.acc.bymax cost.acc.bymax   growth
  <chr>      <dbl>     <dbl> <dbl>            <dbl>          <dbl>    <dbl>
1 alb         7997      3996  4001             2998           1501   497   
2 bob         6003      3004  3000             2002           1002     3.74
3 jr          6002      3000  3002             1000            499 -1503  

使用@Jezrael回答:

我得到了

         income_acc    costs_acc          net  income_acc_bymax  \
names                                                            
alb    7997.466538  3996.053670  4001.412868       2997.855009   
bob    6003.488978  3003.540598  2999.948380       2001.533870   
jr     6002.056904  3000.346010  3001.710894        999.833162   

       cost_acc_bymax       growth  
names                               
alb       1500.876851   497.318992  
bob       1002.151162     3.736652  
jr         499.328510 -1502.549221 

2 个答案:

答案 0 :(得分:2)

我认为您需要自定义功能:

memory =  sizeof(d)
for a in d
    memory += sizeof(a)
end

答案 1 :(得分:0)

现在您可以像在 R 中一样使用 datar 进行操作:

>>> from datar.all import f, group_by, summarise, sum, max
>>> 
>>> dfg = group_by(df, f.names) >> summarise(
...     income_acc = sum(f.income),
...     costs_acc = sum(f.costs),
...     net = sum(f.income) - sum(f.costs),
...     income_acc_bymax = sum(f.income[f.date==max(f.date)]),
...     cost_acc_bymax = sum(f.costs[f.date==max(f.date)]),
...     growth =  f.income_acc_bymax + f.cost_acc_bymax - f.net
... )
>>> dfg
     names   income_acc    costs_acc          net  income_acc_bymax  cost_acc_bymax       growth
  <object>    <float64>    <float64>    <float64>         <float64>       <float64>    <float64>
0      alb  7746.653816  3605.367002  4141.286814       2785.500946     1587.685103   231.899235
1      bob  6348.897809  3354.059777  2994.838032       2153.386953     1215.116245   373.665167
2       jr  6205.690386  3034.601030  3171.089356        983.316234      432.851030 -1754.922093

我是包的作者。如果您有任何问题,请随时提交问题。