【问题标题】:Get the previous and next three values from an column of pandas dataframe从一列熊猫数据框中获取前三个值和后三个值
【发布时间】:2021-05-19 19:29:51
【问题描述】:

我是 python 和 pandas 的新手。在这里,我有一个数据框,其中有两列。

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 中,我试图从值为 0 的那些的 predictedFeature 列中获取前 3 个值。 因此,例如第三行值是0,所以我试图获取前三个值[2000, 2000],接下来三个是[2200, 2200, 0]。我正在为predictedFeature 列中的每个0 尝试这个。这样我就可以获得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

【问题讨论】:

  • 我很好奇你在这个非规范化数据结构背后的意图是什么。为什么将列表作为熊猫元素?为什么不是 3 + 3 列 prev3prev2、...、next3?你确定你的问题定义正确吗?
  • 实际上,我想将 0 替换为其上一个和下一个值中的一个值。如果前 3 个值与后三个值相同,则该 0 将替换为该数组中的值。
  • 没有 3 个 prev / next 值的表格开头和结尾的预期行为是什么?
  • 如果没有,那么我们可以在那里添加 na 或 0 值或类似的东西,你可以建议
  • 如果您的实际目标只是替换零值,则预期输出中不需要 previousNext 列。所以我认为它们现在只是为了说明?

标签: python python-3.x pandas numpy


【解决方案1】:

您可以通过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 的第一行和最后一行并分别处理这些情况。希望这对您有所帮助。

【讨论】:

  • 我希望上一个和下一个值只有 0,而不是像它们应该在中间一样。。只要有 0,它就应该得到这个值
  • 不确定你的意思。也许您可以展示您的预期输出?
  • 我刚刚更新了预期的输出。它有一点缩进问题.. 上一个和下一个是列名。 Na 用于预测特征列中值不为 0 的那些
  • 在这里,有什么方法可以获取偏移值以及它正在获取上一个和下一个值。这样我就可以检查天气上一个和下一个值是否相同,如果相同那么我可以替换那个值
  • 我刚刚用正确的预期输出更新了问题。请检查一次。
猜你喜欢
  • 2018-12-12
  • 2019-04-07
  • 2022-01-25
  • 1970-01-01
  • 2018-08-12
  • 2021-08-31
  • 2022-01-11
  • 2015-09-06
相关资源
最近更新 更多