【问题标题】:Pandas groupby: get product value for each individual groupPandas groupby:获取每个组的产品价值
【发布时间】:2018-03-27 17:53:27
【问题描述】:

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

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

我得到一个单一的值(我认为它得到了一切的产品。我如何获得每个组的产品(每年的单一值)

【问题讨论】:

    标签: python pandas vector multiplication pandas-groupby


    【解决方案1】:

    你可以在groupbyapply函数之外使用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、更高效

    【讨论】:

    • 我永远相信你会回答我的问题 :) 谢谢。但我只是好奇是否可以用 groupby 来做。执行 groupby(df.date.dt.year).sum() 会为每个组提供单独的值,而不是 prod()。是否有其他函数或参数可以做到这一点?
    • @Fizi 我认为对于您自己的解决方案,您只需更改为(将 prod 放入应用)df.groupby(a.date.dt.year).apply(lambda x: (1+x['value']).prod())
    • @Fizi 还 df.groupby(a.date.dt.year).apply(lambda x: (1+x['value'])) 为每个组返回值,这是 groupby 之后的结果,如果您在末尾添加 .prod() ,这意味着您想将整个列合并在一起,温馨提示,groupby 只跟随一个函数,而不是像`groupby().sum().prod(), In your situation , apply` 这样的链函数被算作一个函数
    • 啊,这很有帮助。此外,在您的解决方案中 - 您能否以某种方式在同一命令中链接乘法 100。由于它是一个系列,我首先分配它,然后在下一步中相乘
    • @Fizi (df.assign(val=df.value+1).groupby(df.date.dt.year).val.prod()-1)*100
    【解决方案2】:
    df.groupby(a.date.dt.year).apply(lambda x: (1+x['value'])).prod()
    

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

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

    这应该会给出你想要的输出。

    【讨论】:

      猜你喜欢
      • 2020-03-09
      • 2021-07-11
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多