我试图计算每个产品按月变化的百分比.这是我到目前为止所拥有的.我有一个涉及单个产品的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
Run Code Online (Sandbox Code Playgroud)
我需要得到的是数据框,其中按月添加的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
Run Code Online (Sandbox Code Playgroud)
我可以使用单个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)
Run Code Online (Sandbox Code Playgroud)
这是我现在正在尝试的:
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']
Run Code Online (Sandbox Code Playgroud)
但是,我在for语句的最后一行返回'NotImplementedError'.
任何关于如何正确计算这个问题的建议都表示赞赏.
好吧,它看起来像是在组内,每月有一个观察,你想要从一个月到下一个月的百分比变化.你可以groupby/apply通过对'product_desc'进行分组然后使用内置pct_change()方法来实现:
>>> df['pct_ch'] = df.groupby('product_desc')['prod_count'].pct_change() + 1
Run Code Online (Sandbox Code Playgroud)
注意,我在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
Run Code Online (Sandbox Code Playgroud)
在旧版本上pandas你可能需要做:
>>> df['pct_ch'] = df.groupby('product_desc')['prod_count'].apply(lambda x: x.pct_change() + 1)
Run Code Online (Sandbox Code Playgroud)
或者您可以按照建议使用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
Run Code Online (Sandbox Code Playgroud)
你不需要df['prod_count']在a中引用groupby,你没有对该列做任何事情.
在旧版本上pandas你可能需要做:
>>> df['pct_ch'] = df.groupby('product_desc')['prod_count'].apply(lambda x: x/x.shift(1))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5791 次 |
| 最近记录: |