Чтобы дать суть, я пытаюсь пометить переменную "RUN", которая удовлетворяет условиям GROUPBY и IF.Ниже приведен код, который я конвертирую в SAS-код в Python, и применил следующую логику SAS:
data data_v1;
retain run;
set data;
by plant material;
if first.material then do;
if sales_quantity = 0 then run = 1; else run = 0;
end;
*keep plant material sales_quantity run;
else do;
if run > 0 then do;
if sales_quantity = 0 or (sales_quantity < 0.01 * Annual_Sales and sales_quantity <= 9)
then run = run + 1; else run = 0;
end;
else do;
if sales_quantity = 0 then run = 1; else run = 0;
end;
end;
run;
Я создал образец кадра данных в Python и реализовал логику, ноя не могу добиться правильного выхода.
Как применить GROUPBY для цикла FOR?Также предложите, если есть какой-либо лучший подход.
import pandas as pd
import numpy as np
df=pd.DataFrame()
df['plant']=['a','a','a','a','b','b','b','b','b','b','b','c','c','c','c','c','c','c','d','d','d','d','d','d']
df['mater']=['x','x','x','y','x','x','x','y','y','y','y','x','x','x','x','y','y','y','y','y','x','x','x','x']
df['salqty']=[0,0,0,10,11,12,13,0,0,13,0,13,0,0,1,0,0,0,1,2,3,0,0,0]
df['plantmaterial'] = df["plant"].map(str) + df["mater"]
df['annual_sales']=0.01
df['flag'] = ((df.plantmaterial != df.plantmaterial.shift()) ).astype(int)
df['run']=0
for i in range(0, len(df)):
if df.loc[i,'flag'].any() == 1:
if df.loc[i,'sales_quantity'].any() == 0:
df.loc[i,'run'] = 1
else:
df.loc[i,'run'] = 0
else:
if df.loc[i-1,'run'].any() > 0:
if ((df.loc[i,'sales_quantity'].any() == 0) or ((df.loc[i,'sales_quantity'].any() < 0.01 * df.loc[i,'annual_sales']) and (df.loc[i,'sales_quantity'].any() <= 9))):
df.loc[i,'run'] = df.loc[i-1,'run'] + 1
else:
df.loc[i,'run'] = 0
else:
if df.loc[i,'sales_quantity'].any() == 0:
df.loc[i,'run'] = 1
else:
df.loc[i,'run'] = 0