【发布时间】:2021-12-24 09:41:05
【问题描述】:
所以我有这个 df
SUPPLIER PRODUCTID STOREID BALANCE AVG_SALES TO_SHIP
SUP1 P1 STR1 50 5 18
SUP1 P1 STR2 6 7 18
SUP1 P1 STR3 74 4 18
SUP2 P4 STR1 35 3 500
SUP2 P4 STR2 5 4 500
SUP2 P4 STR3 54 7 500
始终按供应商和产品 ID 分组。 TO_SHIP 列对于该组是唯一的。因此,例如,我有 18 个产品要发送给带有 P1 的 SUP1。然后我添加新列:
- 计算 Wk_bal = (BALANCE / AVG_SALES)
- 按供应商id-productid 组对 Wk_bal 进行排名
- 组的最低 Wk_bal:SEND_PKGS = +1
- 然后再次计算 Wk_bal,但添加 pkg sent = ((BALANCE+SEND_PKGS) / AVG_SALES)
- 如此循环,直到所有 TO_SHIP 都已分发给最需要的商店
可视化运行:
第一个输出(计算wk_bal,然后发送1 pkg到最低):
SUPPLIER PRODUCTID STOREID BALANCE AVG_SALES TO_SHIP Wk_Bal SEND_PKGS
SUP1 P1 STR1 50 5 18 10 0
SUP1 P1 STR2 6 4 18 1.5 1
SUP1 P1 STR3 8 4 18 2 0
SUP2 P4 STR1 35 3 500 11.67 0
SUP2 P4 STR2 5 4 500 1.25 1
SUP2 P4 STR3 54 7 500 7.71 0
第二个输出(计算更新的wk_bal,发送一个 pkg到最低):
SUPPLIER PRODUCTID STOREID BALANCE AVG_SALES TO_SHIP Wk_Bal SEND_PKGS
SUP1 P1 STR1 50 5 17 10 0
SUP1 P1 STR2 8 4 17 1.75 2
SUP1 P1 STR3 8 4 17 2 0
SUP2 P4 STR1 35 3 499 11.67 0
SUP2 P4 STR2 7 4 499 1.5 2
SUP2 P4 STR3 54 7 499 7.71 0
以此类推……直到剩下 to_ship 为止,计算-排名-给一个 pkg。这个过程的原因是我想确保 wk_balance 最低的商店首先拿到包。 (还有很多其他原因)
我最初是在 SQL 上构建的,但由于复杂性,我转向了 python。不幸的是,我的 python 在提出具有多个条件的循环方面并不是很好,尤其是在 pandas df 上。到目前为止,我已经尝试过(但失败了):
df['Wk_Bal'] = 0
df['TO_SHIP'] = 0
for i in df.groupby(["SUPPLIER", "PRODUCTID"])['TO_SHIP']:
if i > 0:
df['Wk_Bal'] = df['BALANCE'] / df['AVG_SALES']
df['TO_SHIP'] = df.groupby(["SUPPLIER", "PRODUCTID"])['TO_SHIP']-1
df['SEND_PKGS'] = + 1
df['BALANCE'] = + 1
else:
df['TO_SHIP'] = 0
我怎样才能做得更好?
【问题讨论】:
标签: python pandas loops if-statement iteration