【问题标题】:Python - Adding rows to timeseries datasetPython - 向时间序列数据集添加行
【发布时间】:2018-06-19 21:43:14
【问题描述】:

我有一个包含零售数据的 pandas 数据框,其中显示了每周售出的产品总数和周末剩余的库存。不幸的是,数据集仅在产品已售出且剩余库存发生变化时才显示一行。

我想扩展数据集,以便每周销售的每种产品都有一条线。我在下面展示了一个示例 - 如何做到这一点?

原样:

Week Product Sold Stock
1    1       1    10
1    2       1    10
1    3       1    10
2    1       2    8
2    3       3    7

未来:

Week Product Sold Stock
1    1       1    10
1    2       1    10
1    3       1    10
2    1       2    8
2    2       0    10
2    3       3    7

【问题讨论】:

  • 我读了两遍才明白:诀窍是生成2 2 0 10——库存变化为零的行,对吧?

标签: python pandas


【解决方案1】:

使用itertools 中的product 创建一个数据框,其中包含“周”和“产品”这两个列的所有组合,并将merge 与您的原始数据一起使用。假设您的数据框称为dfp

from itertools import product
new_dfp = (pd.DataFrame(list(product(dfp.Week.unique(), dfp.Product.unique())),columns=['Week','Product'])
                 .merge(dfp,how='left'))

你得到new_dfp中缺少的行:

   Week  Product  Sold  Stock
0     1        1   1.0   10.0
1     1        2   1.0   10.0
2     1        3   1.0   10.0
3     2        1   2.0    8.0
4     2        2   NaN    NaN
5     2        3   3.0    7.0

现在你 fillna 在两列上使用不同的值:

new_dfp['Sold'] = new_dfp['Sold'].fillna(0).astype(int) # because no sold in missing rows
new_dfp['Stock'] = new_dfp.groupby('Product')['Stock'].fillna(method='ffill').astype(int)

要填充“库存”,您需要groupby 产品并使用“填充”方法输入与上周“周”相同的值。最后,你得到:

   Week  Product  Sold  Stock
0     1        1     1     10
1     1        2     1     10
2     1        3     1     10
3     2        1     2      8
4     2        2     0     10
5     2        3     3      7

【讨论】:

  • 旁注:这似乎也可以new_dfp['Stock'] = new_dfp.groupby('Product')['Stock'].ffill().astype(int)
  • @Ben.T 谢谢,这是一个很好的解决方案!我遇到的一个问题是并非所有产品都在第 1 周列出,所以当我们运行此代码时,我们最终会得到一个空槽,用于某些无法使用 ffil 填充的产品
  • @user1058210 有意义,在这种情况下你想要什么?如果你想要0,我想你可以试试:new_dfp['Stock'] = new_dfp.groupby('Product')['Stock'].ffill().fillna(0).astype(int)这样,ffill没有填的应该是0
  • @Ben.T 对不起,我没有正确解释自己。基本上代码在数据集上失败,错误为“ValueError:无法将非有限值(NA或inf)转换为整数” - 我认为这是因为上述原因。
  • @user1058210 确实我认为你是对的。但是通过在astype(int) 之前添加fillna(0),就像我之前的评论一样,它应该可以工作。我刚刚通过在第 2 周添加一行带有新产品编号的行来尝试您描述的情况,起初我得到了您的错误,这是通过在 astype(int) 之前添加 fillna(0) 来解决的
猜你喜欢
  • 2011-03-08
  • 2020-02-09
  • 1970-01-01
  • 2021-04-07
  • 2021-12-31
  • 2021-07-17
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多