将pandas列中每个1的大小为n的窗口(上面,下面)替换为1

时间:2019-04-09 23:20:41

标签: pandas python-2.7

我很难用1替换非零数字(二进制​​列)的上下数值。

我查看了在线SO帖子,但找不到解决此问题的方法。

import pandas as pd
import numpy as np
data = pd.DataFrame({'fullwindow' : [2, np.NaN, np.NaN, np.NaN, 3, np.NaN, 4, np.NaN, np.NaN, np.NaN, np.NaN, 5], \
  'up' : [1, np.NaN, np.NaN, np.NaN, 1, np.NaN, 2,np.NaN, np.NaN, np.NaN, np.NaN, 2], \
  'down' :[0, np.NaN, np.NaN, np.NaN, 1, np.NaN, 1, np.NaN, np.NaN, np.NaN, np.NaN, 2]})

print data[['up', 'down', 'fullwindow']]
      up  down  fullwindow
 0   1.0   0.0         2.0
 1   NaN   NaN         NaN
 2   NaN   NaN         NaN
 3   NaN   NaN         NaN
 4   1.0   1.0         3.0
 5   NaN   NaN         NaN
 6   2.0   1.0         4.0
 7   NaN   NaN         NaN
 8   NaN   NaN         NaN
 9   NaN   NaN         NaN
 10  NaN   NaN         NaN
 11  2.0   2.0         5.0

dummy = pd.get_dummies(data.fullwindow)
print dummy
    2.0  3.0  4.0  5.0
0     1    0    0    0
1     0    0    0    0
2     0    0    0    0
3     0    0    0    0
4     0    1    0    0
5     0    0    0    0
6     0    0    1    0
7     0    0    0    0
8     0    0    0    0
9     0    0    0    0
10    0    0    0    0  
11    0    0    0    1

在虚拟数据集列中,大于或小于1的值将替换为1。对于第一列第0行(2.0),全窗口值为2,“ up”和“ down”值分别为1和1因此,列2.0的下一行(行索引1)将从0更改为1。上一行没有任何内容,因此将其保留。如果有两个重叠范围,则它仍为1。对于列4.0,行索引6为1。它具有2个向上和1个向下的位置。因此,行索引4、5、7更改为1

示例的预期输出

    2.0  3.0  4.0  5.0
0     1    0    0    0
1     0    0    0    0
2     0    0    0    0
3     0    1    0    0
4     0    1    1    0
5     0    1    1    0
6     0    0    1    0
7     0    0    1    0
8     0    0    0    0
9     0    0    0    1
10    0    0    0    1  
11    0    0    0    1

对于5.0,行索引11为1,向上为2,导致9、10行更改为1

1 个答案:

答案 0 :(得分:0)

一个很好的问题,我很兴奋:-),我使用dropna,然后使用repeatreindex,在{{1}中使用cumcount进行调整}是关键

index