在熊猫中使用Apply方法进行分组依据:分组值的百分比总和

时间:2018-08-03 03:50:25

标签: python python-3.x pandas

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

1 个答案:

答案 0 :(得分:0)

您的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天。您可能需要对所需的结果进行一些清理。