首页 > 解决方案 > 在 Pandas 中使用 Apply 方法的 Groupby:分组值的百分比和

问题描述

我正在尝试开发一个程序来将每日数据转换为每月或每年的数据等等。我有一个带有日期时间索引和价格变化百分比的 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 () 是如何工作的。它似乎将我的功能应用于所有数据,而不仅仅是分组项目。

标签: pythonpython-3.xpandas

解决方案


apply正在单独应用于所有行,因为您按date列分组。您的日期列看起来每行都有唯一值,因此每个组中只有一行。您需要使用 aGrouper按月分组,然后使用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 天。您可能需要根据您想要的结果进行一些清理。


推荐阅读