问题--如何使用规则复制最后一列“计算运行op股票”。必须能够解释多种产品。(编辑以尝试增加清晰度)
规则(基于示例数据的数字):
感觉应该很简单,但我对Python还不熟悉,所以无法理解。尝试了shift(1),但只对没有值的第一行工作。试过累积和不算零而没有运气。如果这是更好的实践,我很高兴我应该使用助手列,或者让数据水平运行而不是垂直运行?
df = pd.DataFrame({
'product':['A','A','A'],
'week':pd.date_range('9/12/2022', periods=3, freq='W'),
'sales':[3,0.5,0],
'forecast':[5,3,7],
'production':[4,2,3],
'opening stock':[10,np.nan,np.nan],
'calculated running op stock': [10,11,10] # This is what i want to calculate based on the criteria above
})输入:
product week sales forecast production opening stock
0 A 2022-09-18 3.0 5 4 10.0
1 A 2022-09-25 0.5 3 2 NaN
2 A 2022-10-02 0.0 7 3 NaN期望产出:
product week sales forecast production opening stock calculated running op stock
0 A 2022-09-18 3.0 5 4 10.0 10
1 A 2022-09-25 0.5 3 2 NaN 11
2 A 2022-10-02 0.0 7 3 NaN 10发布于 2022-09-28 17:38:42
您可以简单地迭代这些行并根据上一行和当前行分配值:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'product':['A','A','A'],
'week':pd.date_range('9/12/2022', periods=3, freq='W'),
'sales':[3,0.5,0],
'forecast':[5,3,7],
'production':[4,2,3],
'opening stock':[10,np.nan,np.nan]
})
df["calculated running op stock"] = df['opening stock']
prev_na = False
for idx in range(len(df)):
row = df.iloc[idx]
prev_row = df.iloc[idx-1] if idx>0 else None
if pd.isna(row["calculated running op stock"]): # CASE 0
if prev_na: # CASE 2
df.loc[idx, "calculated running op stock"] = prev_row["calculated running op stock"] - prev_row["forecast"] + prev_row["production"]
else: # CASE 1
df.loc[idx, "calculated running op stock"] = prev_row["calculated running op stock"] - prev_row["sales"] + prev_row["production"]
prev_na = True
else:
prev_na = False输出:
product week sales forecast production opening stock calculated running op stock
0 A 2022-09-18 3.0 5 4 10.0 10.0
1 A 2022-09-25 0.5 3 2 NaN 11.0
2 A 2022-10-02 0.0 7 3 NaN 10.0https://stackoverflow.com/questions/73874799
复制相似问题