微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我试图计算每种产品按月变化的百分比.这是我到目前为止所拥有的.我有一个涉及单个产品的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’.

任何关于如何正确计算这个问题的建议都表示赞赏.

解决方法:

好吧,它看起来像是在组内,每月有一个观察,你想要从一个月到下一个月的百分比变化.您可以通过分组’product_desc’然后使用内置的pct_change()方法对groupby / apply执行此操作:

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

在旧版本的熊猫上,您可能需要这样做:

>>> 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’],你没有对该列做任何事情.

在旧版本的熊猫上,您可能需要这样做:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐