Получить предыдущее и следующие три значения из столбца pandas dataframe - PullRequest
2 голосов
/ 02 ноября 2019

Я новичок в питоне и пандах. Здесь у меня есть фрейм данных, в котором у меня есть два столбца.

Offset       predictedFeature
 0              2
 5              2
 11             0
 21             22
 28             22
 32              0
 38             21
 42             21
 52             21
 55              0
 58              0
 62              1
 66              1
 70              1
 73              0
 78              1
 79              1

Итак, в этом df я пытаюсь получить предыдущие 3 значения из столбца predictedFeature тех, где значение равно 0. Так, например, значение 3-й строки равно 0, поэтому я пытаюсь получить предыдущие 3 значения, которые равны [2000, 2000], а следующие три значения [2200, 2200, 0]. Я пытаюсь это для каждого 0, который находится в столбце predictedFeature. Так что я могу получить df, в котором эти два столбца будут новыми: Предыдущие и следующие значения.

Offset       feature       previous        Next            NewFeature 
 0              2             -             -                 2
 5              2             -             -                 2
 11             0           [2,2]          [22,22,0]          0
 21             22             -            -                 22
 28             22            -             -                 22
 32              0          [22,22,0]      [21,21,21]          0
 38             21            -              -                21 
 42             21            -              -                21
 52             21            -              -                21 
 55              0           [21,21,21]     [0,1,1]            0
 58              0           [0,21,21]      [1,1,1]            0   
 62              1             -              -                1
 66              1             -              -                1
 70              1             -              -                1
 73              0           [1,1,1]         [1,1]             1 
 78              1             -               -               1
 79              1             -               -               1

1 Ответ

1 голос
/ 02 ноября 2019

Вы можете применить оконный вид к массиву через numpy.lib.stride_tricks.as_strided. Вот функция, которую я создал некоторое время назад именно для этой цели. Это немного сложно понять. По сути, функция просто изменяет шаги памяти или шагает вдоль вновь созданной оси таким образом, что в каждой строке отображается сдвинутая версия предыдущего.

def windowed_view(x, window_size):
    """Create a 2d windowed view of a 1d array.

    `x` must be a 1d numpy array.

    `numpy.lib.stride_tricks.as_strided` is used to create the view.
    The data is not copied. You should never write to a windowed view.

    Example:

    >>> x = np.array([1, 2, 3, 4, 5, 6])
    >>> windowed_view(x, 3)
    array([[1, 2, 3],
            [2, 3, 4],
            [3, 4, 5],
            [4, 5, 6]])
    """
    assert window_size <= x.size, "window_size (%s) must be <= x.size (%s)" % (window_size, x.size)
    return np.lib.stride_tricks.as_strided(
        x,
        shape=(x.size - window_size + 1, window_size),
        strides=(x.strides[0], x.strides[0])
    )

df = pd.DataFrame({'predictedFeature': [2000,2000,0,2200,2200,0,2100,2100,2100,0,0,100,100,100,0,100,100]})
w = windowed_view(df.predictedFeature, 7)

[[2000 2000    0 2200 2200    0 2100]
 [2000    0 2200 2200    0 2100 2100]
 [   0 2200 2200    0 2100 2100 2100]
 [2200 2200    0 2100 2100 2100    0]
 [2200    0 2100 2100 2100    0    0]
 [   0 2100 2100 2100    0    0  100]
 [2100 2100 2100    0    0  100  100]
 [2100 2100    0    0  100  100  100]
 [2100    0    0  100  100  100    0]
 [   0    0  100  100  100    0  100]
 [   0  100  100  100    0  100  100]]

Однако вы хотите толькостроки, где 0 находится посередине:

w[w[:,3]==0,:]

[[   0 2200 2200    0 2100 2100 2100]
 [2100 2100 2100    0    0  100  100]
 [2100 2100    0    0  100  100  100]]

Единственная проблема - это начало и конец анализируемой серии, поскольку представление содержит только строки с полным окном. Вы пропускаете несколько нулей там. Однако вы можете перебирать первую и последнюю строку w и обрабатывать эти случаи отдельно. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...