gpt4 book ai didi

python - 如何为 groupby DataFrame 创建滚动百分比

转载 作者:太空宇宙 更新时间:2023-11-03 15:13:33 25 4
gpt4 key购买 nike

我正在尝试计算每种产品按月计算的百分比变化。这是我到目前为止所拥有的。我为涉及单个产品的 DataFrame 工作。我对如何将计算应用于包含许多产品和许多月份的结果集感到困惑。

示例数据框:

product_desc    activity_month    prod_count
product_a 1/1/2014 53
product_b 1/1/2014 42
product_c 1/1/2014 38
product_a 2/1/2014 26
product_b 2/1/2014 48
product_c 2/1/2014 39
product_a 3/1/2014 41
product_b 3/1/2014 35
product_c 3/1/2014 50

我需要取出的是数据框,其中添加了 product_desc 按月添加的百分比变化:

product_desc    activity_month   prod_count pct_change
product_a 1/1/2014 53
product_a 2/1/2014 26 0.490566038
product_a 3/1/2014 41 1.576923077
product_b 1/1/2014 42
product_b 2/1/2014 48 1.142857143
product_b 3/1/2014 35 0.729166667
product_c 1/1/2014 38
product_c 2/1/2014 39 1.026315789
product_c 3/1/2014 50 1.282051282

我可以使用单个 product_desc 在数据框上计算这个:

df['change_rate1'] = df['prod_count'].shift(-1)/df['prod_count']
df['pct_change'] = df['change_rate1'].shift(1)
df = df.drop('change_rate1',1)

这是我现在正在尝试的:

df_grouped = df.groupby(['product_desc','activity_month'])

for product_desc, activity_month in df_grouped:
df['change_rate1'] = df_grouped['prod_count'].shift(-1)/df_grouped['prod_count']

但是,我在 for 语句的最后一行返回了一个“NotImplementedError”。

如有任何关于如何正确计算此值的建议,我们将不胜感激。

最佳答案

好吧,看起来在组内,每个月有一个观察结果,并且您想要从一个月到下一个月的百分比变化。您可以使用 groupby/apply 对“product_desc”进行分组,然后使用内置的 pct_change() 方法:

>>> df['pct_ch'] = df.groupby('product_desc')['prod_count'].pct_change() + 1

请注意,我向 pct_change() 方法添加了 1,因为它计算的是净百分比变化。我将打印出一个排序后的版本,以便它符合您的预期输出:

>>> df.sort('product_desc')

product_desc activity_month prod_count pct_ch
0 product_a 2014-01-01 53 NaN
3 product_a 2014-02-01 26 0.490566
6 product_a 2014-03-01 41 1.576923
1 product_b 2014-01-01 42 NaN
4 product_b 2014-02-01 48 1.142857
7 product_b 2014-03-01 35 0.729167
2 product_c 2014-01-01 38 NaN
5 product_c 2014-02-01 39 1.026316
8 product_c 2014-03-01 50 1.282051

在旧版本的 pandas 上,您可能必须这样做:

>>> df['pct_ch'] = df.groupby('product_desc')['prod_count'].apply(lambda x: x.pct_change() + 1)

或者您可以按照您的建议使用 shift 并稍作修改:

>>> df['pct_ch'] = df['prod_count'] / df.groupby('product_desc')['prod_count'].shift(1)
>>> df.sort('product_desc')

product_desc activity_month prod_count pct_ch
0 product_a 2014-01-01 53 NaN
3 product_a 2014-02-01 26 0.490566
6 product_a 2014-03-01 41 1.576923
1 product_b 2014-01-01 42 NaN
4 product_b 2014-02-01 48 1.142857
7 product_b 2014-03-01 35 0.729167
2 product_c 2014-01-01 38 NaN
5 product_c 2014-02-01 39 1.026316
8 product_c 2014-03-01 50 1.282051

您不需要在 groupby 中引用 df['prod_count'],您不会对该列执行任何操作。

在旧版本的 pandas 上,您可能必须这样做:

>>> df['pct_ch'] = df.groupby('product_desc')['prod_count'].apply(lambda x: x/x.shift(1))

关于python - 如何为 groupby DataFrame 创建滚动百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23749342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com