首页 > 解决方案 > 是否可以为数据框的每一列创建一个额外的 pct_change 列?

问题描述

我试图自己解决这个问题,并搜索了其他主题以寻求帮助,但是,我的问题仍然存在。如果有人可以帮助我或指出正确的方向,我将不胜感激

我对 python 还很陌生,我正在尝试对 pandas 数据框进行一些更改。总而言之,我想验证销售数据的百分比变化。

我知道 pct_change 方法,下面是我尝试过的方法。

这是一个看起来像我的原始数据框的示例数据:

  store_id  sales_value      day
0   1       54,141.00        2020-12-22
1   1       78,921.00        2020-12-23
2   6       5,894.00         2020-12-24
3   6       22,991.00        2020-12-23
4   6       25,802.00        2020-12-22

我做了一个函数来计算行的变化。它看起来像这样:

def var_percent(df, n):
    return df.pct_change(n)

然后,使用:

df['var_pct'] = var_percent(df['sales_value'],1)

它给了我类似以下的东西:

  store_id  sales_value    day           var_pct
0   1       54,141.00      2020-12-22    nan
1   1       78,921.00      2020-12-23    0.46
4   6       25,802.00      2020-12-22   -0.67
3   6       22,991.00      2020-12-23   -0.11
2   6       5,894.00       2020-12-24   -0.74

那不是我真正想要的。我需要单独查看每个商店的更改(store_id),这种类型的配置计算行,无论它来自哪个商店。

继续前进,我尝试了这个:

df.set_index(["day", "store_id"]).unstack(level=1)

最后我得到了我的实际数据框,我坚持使用它,它有点像这样:

sotore_id     1      6       15      22   
day                                         
2020-12-22  54141   25802   173399  36,200.00   
2020-12-23  78921   22991   234885  32,762.00   
2020-12-24  0       5894         0  10,956.00   
2020-12-26  0   0   0         0.00      10980   
2020-12-28  0   0   0         0.00          0   

现在数据框是我需要的样子,但我还没有找到一种方法来实现 pct_change 我想要的方式,就像这样,为每个现有列添加一个百分比变化列(这些是虚拟数字,它是只是我希望它的视觉表示):

sotore_id     1     1_pct    6       6_pct      15      15_pct    
day                                         
2020-12-22  54141   0        25802       0      173399       0  
2020-12-23  78921   25       22991      -8      234885      20  
2020-12-24  0       0        5894      -60      0            0
2020-12-26  0       0        0.00        0      10980     1000
2020-12-28  0       0        0.00        0      0            0

甚至有可能这样做吗?

标签: pythonpandas

解决方案


您可以使用以下内容:

销售值应转换为数字,日期应更改为日期时间,然后对数据进行排序。如果所有这些都已经完成,您可以跳过此块:

df['sales_value']=pd.to_numeric(df['sales_value'].str.replace(",",''))
df['day'] = pd.to_datetime(df['day'])
df = df.sort_values(['store_id','day'])

计算pct_change每组,然后unstack

out = (df.assign(pct=df.groupby("store_id")['sales_value'].pct_change()
      .mul(100).round()).set_index(["day", "store_id"])
      .unstack(level=1).fillna(0).sort_index(level=1,axis=1))

out.columns =  out.columns.map('{0[1]} {0[0]}'.format)

print(out)
1% 1 个销售价值 6% 6 销售价值
2020-12-22 0.0 54141.0 0.0 25802.0
2020-12-23 46.0 78921.0 -11.0 22991.0
2020-12-24 0.0 0.0 -74.0 5894.0

推荐阅读