【问题标题】:Groupby with Apply Method in Pandas : Percentage Sum of Grouped Values在 Pandas 中使用 Apply 方法的 Groupby:分组值的百分比和
【发布时间】:2018-08-07 09:25:27
【问题描述】:

我正在尝试开发一个程序来将每日数据转换为每月或每年的数据等等。 我有一个带有日期时间索引和价格变化 % 的 DataFrame:

                % Percentage
Date
2015-06-02      0.78
2015-06-10      0.32
2015-06-11      0.34
2015-06-12     -0.06
2015-06-15     -0.41
...

我按某个频率成功分组。然后我测试了:

 df.groupby('Date').sum()
 df.groupby('Date').cumsum()

如果是这种情况,它会正常工作,但问题是我无法将它的百分比相加 (1+x0) * (1+x1)...-1。然后我尝试了:

def myfunc(values):
    p = 0    
    for val in values:
        p = (1+p)*(1+val)-1
    return p

df.groupby('Date').apply(myfunc)

我不明白 apply () 是如何工作的。它似乎将我的功能应用于所有数据,而不仅仅是分组项目。

【问题讨论】:

  • 你能说明一下,你的预期输出是什么?
  • 当然。我刚刚编辑了帖子。谢谢。

标签: python python-3.x pandas


【解决方案1】:

您的apply 单独应用于所有行,因为您按date 列分组。您的日期列看起来每行都有唯一值,因此每个组中只有一行。您需要使用Grouper 按月分组,然后使用cumprod 并获取每个组的最后一个值:

# make sure Date is a datetime
df["Date"] = pd.to_datetime(df["Date"])

# add one to percentages
df["% Percentage"] += 1

# use cumprod on each month group, take the last value, and subtract 1
df.groupby(pd.Grouper(key="Date", freq="M"))["% Percentage"].apply(lambda g: g.cumprod().iloc[-1] - 1)

但请注意,这会应用百分比增长,就好像您的行之间的步数相同,但看起来有时是 8 天,有时是 1 天。您可能需要根据您想要的结果进行一些清理。

【讨论】:

    猜你喜欢
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 2014-06-16
    • 2022-01-23
    相关资源
    最近更新 更多