在groupby中创建多个列进行计算?

时间:2018-06-26 08:23:09

标签: python pandas

我有一个像这样的数据集:

SKU,Date,Inventory,Sales,Incoming
2010,2017-01-01 0:00:00,85,126,252
2010,2017-02-01 0:00:00,382,143,252
2010,2017-03-01 0:00:00,414,139,216
2010,2017-04-01 0:00:00,468,120,216
7770,2017-01-01 0:00:00,7,45,108
7770,2017-02-01 0:00:00,234,64,216
7770,2017-03-01 0:00:00,160,69,36
7770,2017-04-01 0:00:00,150,50,72
7870,2017-01-01 0:00:00,41,29,36
7870,2017-02-01 0:00:00,95,18,36
7870,2017-03-01 0:00:00,112,16,36
7870,2017-04-01 0:00:00,88,19,0

库存数量是“实际”记录的数量,可能与我要计算的假设剩余数量有所不同。

销售数量实际上可以延长到未来更长的时间。在这些行中,其他两列将具有NA。

我要创建以下内容:

  1. 仅采用每个SKU的第一个Inventory

  2. 使用第一个值通过使用递归公式[Earliest inventory] - [Sales for that month] - [Incoming qty for that month]计算假设的剩余量(注意:Earliest inventory是每个SKU的固定量)。将输出存储在名为“月末第1部分”的列中。

  3. 使用以下条件创建另一个称为“购买数量”的列:如果剩余数量少于50,则创建一个新列以指示购买数量(假设所有3个SKU为30)数量减少30)。如果剩余数量大于50,则购买数量为零。

  4. 创建另一个名为“月末第2部分”的列,为“月末第1部分”添加“购买数量”

我可以使用以下代码获取每个SKU的第一个数量,并将其合并到数据集中的名为first_qty的列中

first_qty_series = dataset.groupby(by=['SKU']).nth(0)['Inventory']
first_qty_series = pd.DataFrame(dataset).reset_index().rename(columns={'Inventory': 'Earliest inventory'})
dataset = pd.merge(dataset, pd.DataFrame(first_qty_series), on='SKU' )

对于剩余数量,我考虑过在两列dataset['Sales']dataset['Incoming']上使用cumsum(),但是我认为这将不起作用,因为cumsum()将对所有SKU求和。

这就是为什么我认为我需要在groupby中执行计算。但是我不知道该怎么办。

(编辑:)预期输出为: enter image description here

谢谢你们!

1 个答案:

答案 0 :(得分:0)

这是一种处理所需的4列的方法。

1-另一种方法,使用locdrop_duplicates用“库存”中的值填充每个“ SKU”的第一行,然后使用ffill填充以下内容行,但是您的方法很好。

dataset.loc[dataset.drop_duplicates(['SKU']).index,'Earliest inventory'] = dataset['Inventory']
dataset['Earliest inventory'] = dataset['Earliest inventory'].ffill().astype(int)

2-实际上,您需要cumsumgroupby来创建“月末第1部分”列,而不是在“最早的库存”列上,因为对于某列,每一行的值都相同相同的“ SKU”。注意:根据您的结果(和逻辑),我在“传入”列之前将-更改为+,如果我误解了问题,只需更改符号即可。

dataset['End of Month Part 1'] = (dataset['Earliest inventory'] 
                                   - dataset.groupby('SKU')['Sales'].cumsum() 
                                    + dataset.groupby('SKU')['Incoming'].cumsum())

3-可以再次使用loc来实现“购买数量”列,该条件再次满足“月末第1部分”列中值小于50的条件,然后满足fillna且值为0

dataset.loc[dataset['End of Month Part 1'] <= 50, 'Buy Quantity'] = 30
dataset['Buy Quantity'] = dataset['Buy Quantity'].fillna(0).astype(int)

4-最后,最后一列只是添加创建的两个鞋last

dataset['End of Month Part 2'] = dataset['End of Month Part 1'] + dataset['Buy Quantity']

如果我对这4点很了解,则应该使用新列获取数据集