【发布时间】:2022-08-17 18:27:14
【问题描述】:
这是我的样本数据:
存货是基于一个产品
Customer Product Quantity Inventory
1 A 100 800
2 A 1000 800
3 A 700 800
4 A 50 800
5 B 20 100
6 B 50 100
7 B 40 100
8 B 30 100
代码需要创建此数据:
data = {
\'Customer\':[1,2,3,4,5,6,7,8],
\'Product\':[\'A\',\'A\',\'A\',\'A\',\'B\',\'B\',\'B\',\'B\'],
\'Quantity\':[100,1000,700,50,20,50,40,30],
\'Inventory\':[800,800,800,800,100,100,100,100]
}
df = pd.DataFrame(data)
我需要得到一个已知的新列可承诺这是通过从先前可用于承诺的数量中减去数量来计算的,并且仅当先前可用的库存大于订单数量时才会进行计算。
这是我的预期输出:
Customer Product Quantity Inventory Available to Promise
1 A 100 800 700 (800-100 = 700)
2 A 1000 800 700 (1000 greater than 700 so same value)
3 A 700 800 0 (700-700 = 0)
4 A 50 800 0 (50 greater than 0)
5 B 20 100 80 (100-20 = 80)
6 B 50 100 30 (80-50 = 30)
7 B 40 100 30 (40 greater than 30)
8 B 30 100 0 (30 - 30 = 0)
我已经在 python pandas 中使用 for 循环和 itterows 实现了这一点
这是我的代码:
master_df = df[[\'Product\',\'Inventory\']].drop_duplicates()
master_df[\'free\'] = df[\'Inventory\']
df[\'available_to_promise\']=np.NaN
for i,row in df.iterrows():
if i%1000==0:
print(i)
try:
available = master_df[row[\'Product\']==master_df[\'Product\']][\'free\'].reset_index(drop=True).iloc[0]
if available-row[\'Quantity\']>=0:
df.at[i,\'available_to_promise\']=available-row[\'Quantity\']
a = master_df.loc[row[\'Product\']==master_df[\'Product\']].reset_index()[\'index\'].iloc[0]
master_df.at[a,\'free\'] = available-row[\'Quantity\']
else:
df.at[i,\'available_to_promise\']=available
except Exception as e:
print(i)
print(e)
print((df.columns))
df = df.fillna(0)
由于为了python中的循环太慢了,当有大量数据输入时,这个循环需要很长时间才能执行,因此我的aws lambda函数失败了
你们可以通过引入一个可以在几秒钟内执行的循环的更好替代方案来帮助我优化这段代码吗?
-
@norok2 我已经用代码编辑了问题以创建数据框
-
@norok2 是的,你是对的。我已经改变了它。
标签: python pandas dataframe numpy vectorization