代码之家  ›  专栏  ›  技术社区  ›  Fizi

熊猫groupby:获取每个群体的产品价值

  •  1
  • Fizi  · 技术社区  · 7 年前

    这听起来可能有点愚蠢,所以请提前道歉。我有这样的数据框架:

                value       date
    0           1.0         2010-01-31
    1           0.3         2010-02-28
    2           1.6         2011-03-31
    3           2.5         2011-04-30
    4          -1.0         2012-05-31
    5          -0.3         2012-06-30
    6           1.6         2013-07-31
    

    我想按年份将其分组,并将以下公式应用于每组 [[(1+v1)*(1+v2)*(1+v3)*…(1+vn)]-1]*100 因此,运算是将一组中的每个元素加1,然后取其乘积,然后从所得值中减去1,然后再乘以100

    但当我这么做的时候

    df.groupby(a.date.dt.year).apply(lambda x: (1+x['value'])).prod()
    

    我得到一个单一的价值(我认为它得到了所有东西的产品。我如何得到每个群体的产品(每年一个单一的价值)

    2 回复  |  直到 7 年前
        1
  •  4
  •   BENY    7 年前

    你可以在 groupby apply 功能,带 assign

    df.assign(val=df.value+1).groupby(df.date.dt.year).val.prod()-1
    Out[800]: 
    date
    2010    1.6
    2011    8.1
    2012   -1.0
    2013    1.6
    Name: val, dtype: float64
    

    两个好处:

    1、更容易理解

    2、效率更高

        2
  •  1
  •   Shreyas Shandilya    7 年前
    df.groupby(a.date.dt.year).apply(lambda x: (1+x['value'])).prod()
    

    此语句将计算各列中所有值的乘积。因此,无论数据是否已按年份分组,都只会返回一个值。 但如果你申请 prod() lambda函数中的函数,如图所示-

    df.groupby(a.date.dt.year).apply(lambda x: (1+x['value']).prod())
    

    这将提供您想要的输出。