панды делят контуры на верхние пределы и затем продолжают с остатком в другом столбце - PullRequest
2 голосов
/ 01 ноября 2019

У меня есть DataFrame такое, что:

            Amt 
Date  
01/01/2000  10    
01/02/2000  10    
01/03/2000  10    
01/04/2000  10    
01/05/2000  10    
01/06/2000  10    
01/07/2000  10

Теперь предположим, что у меня есть два хранилища для хранения Amt продукта, который я приобретаю; Хранилище 1 , которое имеет ограничение 22,5, и Хранилище 2 , которое имеет емкость 30. Я хотел бы добавить оба из них в виде столбцов и иметь их суммарную сумму в каждом SPLIT количество Amt (на каждые 10, 5 входит в каждый). Как только Хранилище 1 достигнет емкости, я бы хотел, чтобы остаток попал в Хранилище 2 , пока он не заполнится, после чего остаток перейдет в третий столбец. Продажа . После этого Amt может продолжать накапливаться в столбце Sell для оставшейся части DataFrame, так что результат будет выглядеть следующим образом:

            Amt | Storage 1 | Storage 2 | Sell |
Date  
01/01/2000  10    5           5           0
01/02/2000  10    10          10          0
01/03/2000  10    15          15          0
01/04/2000  10    20          20          0
01/05/2000  10    22.5        27.5        0
01/06/2000  10    22.5        30          7.5
01/07/2000  10    22.5        30          17.5

Мне известноиз cumsum, но я не уверен, как установить условия для него, и при этом я не знаю, как извлечь остаточное значение в случае, если память заполняется.

Я прошу прощения, если это неясно. Если мне не хватает необходимой информации, пожалуйста, дайте мне знать. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 01 ноября 2019

Используйте np.select, чтобы получить объем хранилища:

s = df["Amt"].cumsum()

df["Storage 1"] = np.select([s<=45, s>45],
                            [s/2,22.5])
df["Storage 2"] = np.select([s<=52.5, s>52.5],
                            [s-df["Storage 1"], 30])

df["Sell"] = s-df["Storage 1"]-df["Storage 2"]

print (df)
#

            Amt  Storage 1  Storage 2  Sell
Date
01/01/2000   10        5.0        5.0   0.0
01/02/2000   10       10.0       10.0   0.0
01/03/2000   10       15.0       15.0   0.0
01/04/2000   10       20.0       20.0   0.0
01/05/2000   10       22.5       27.5   0.0
01/06/2000   10       22.5       30.0   7.5
01/07/2000   10       22.5       30.0  17.5
1 голос
/ 01 ноября 2019

Поскольку все значения в Amt одинаковы, вы можете создать каждый столбец, используя cumsum и clip следующим образом

s = df.Amt.cumsum()
df['Storage 1'] = (s/2).clip(upper=22.5)
df['Storage 2'] = (s - df['Storage 1']).clip(upper=30)
df['sell'] = s - df['Storage 1'] - df['Storage 2']

Out[556]:
            Amt  Storage 1  Storage 2  sell
Date
01/01/2000   10        5.0        5.0   0.0
01/02/2000   10       10.0       10.0   0.0
01/03/2000   10       15.0       15.0   0.0
01/04/2000   10       20.0       20.0   0.0
01/05/2000   10       22.5       27.5   0.0
01/06/2000   10       22.5       30.0   7.5
01/07/2000   10       22.5       30.0  17.5
...