Надо сделать по нормальному, без таблиц, с использованием стека, который можно сделать просто тупо списком.
Обрабатывайте все записи в хронологическом порядке.
При приходе in, вы добавляете в стек (через append у list-а) пару (цена, количество).
При приходе out, вы берете из стека с верхушки записи, пока не наберете нужное количество и уменьшаете количество. В конце пеобразуйте список в таблицу, если надо.
Что-то вроде такого (сам не питонист, возможно придется переписать немного)
def getOstatokLIFO(df):
stack = [];
for index, row in df.iterrows():
if row.operation == "in":
stack.append([row.price, row.quantity])
continue
left = row.quantity
while left > 0:
if left >= stack[-1][1]:
left -= stack[-1][1]
stack.pop()
else:
stack[-1][1] -= left
left = 0
return stack
Но вообще, DataFrame очень медленно работет при такой последовательной обработке, поэтому я бы посоветовал вам не создавать pandas dataframe изначально, и получить ваши данные в виде списка словарей, touples или объектов. А алгоритм расчета предполагает последовательную обработку.