У меня есть Pandas Dataframe, как показано ниже, у меня есть столбец с именем Quantity_with_sign
.Проблема с этими данными в том, что порядок строк не такой, как ожидалось.Обычно это cum_sum
этой серии не доходит, т. Е. Всегда имеет большие положительные значения сумм до прихода отрицательных.Но мои данные теперь имеют альтернативные строки.то есть, cum_sum
имеет отрицательные записи.Я хочу поменять эти записи, чтобы они всегда поддерживали значение cum_sum отличным от нуля.
Пример-1
ВХОД ОБРАЗЦА:
Posting Date Quantity_with_sign
0 2018-03-15 217
1 2018-03-25 -218
2 2018-04-25 4144
3 2018-06-07 -1
4 2018-06-07 -1
5 2018-06-07 -2330
6 2018-06-08 -1811
ВЫБОР ВЫБОРА:
Posting Date Quantity_with_sign
0 2018-03-15 217
1 2018-04-25 4144
2 2018-03-25 -218
3 2018-06-07 -1
4 2018-06-07 -1
5 2018-06-07 -2330
6 2018-06-08 -1811
Пример-2
ОБРАЗЕЦ ВХОДА:
Posting Date Quantity_with_sign
0 2018-06-09 1111
1 2018-07-09 -1111
2 2018-07-13 -1111
3 2018-08-09 1111
ВЫБОР ОБРАЗЦА:
Posting Date Quantity_with_sign
0 2018-06-09 1111
1 2018-07-09 -1111
2 2018-08-09 1111
3 2018-07-13 -1111
Пример-3
ВВОД ОБРАЗЦА:
Posting Date Quantity_with_sign
0 2018-04-25 -672
1 2018-06-07 578
2 2018-06-07 94
ВЫБОР ОБРАЗЦА:
Posting Date Quantity_with_sign
0 2018-06-07 578
1 2018-06-07 94
2 2018-04-25 -672
Примечание: Для этой задачи я не могу просто отсортировать (убрать) значения и сделать cum_sum положительным.здесь следует поддерживать порядок
Например, если у меня есть строки в этом порядке
10
5
20
-12
34
.
.
.
Я не могу разместить -12 после 20 или 34, Он должен быть размещен после5. Потому что после того, как 5 cum_sum пересекли> 12. Поэтому я должен поместить -12 после 5.
До сих пор я пытался найти, где отрицательные элементы должны быть размещены, используя подход с использованием массива.
x=df['Quantity_with_sign']>0
pos=df[x]['Quantity_with_sign'].values
neg=df[~x]['Quantity_with_sign'].values.tolist()
cum_sum=np.cumsum(pos)
res=copy.copy(pos)
while(len(neg)!=0):
first=neg.pop(0)*-1
ind= np.argmax(cum_sum>=first)
res.insert(first,ind+1)
Я не удовлетворен таким подходом.Пожалуйста, помогите мне решить эту проблему более обобщенным способом.