如何根据比较交换行?

时间:2018-11-14 07:57:02

标签: python pandas

我有一个如下所示的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)

我对这种方法不满意。请帮助我以更一般的方式解决这个问题。

0 个答案:

没有答案