我有一个如下所示的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
.
.
.
我不能在-20或34之后放置-12,应该将其放置在5之后。因为5 cum_sum越过了12。所以我应该在5之后放置-12。
到目前为止,我尝试使用numpy数组方法来查找负元素的放置位置。
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)
我对这种方法不满意。请帮助我以更一般的方式解决这个问题。