【问题标题】:How to get pandas dataframe where columns are the subsequent n-elements from another column dataframe?如何获取熊猫数据框,其中列是来自另一个列数据框的后续 n 元素?
【发布时间】:2017-03-06 03:59:25
【问题描述】:

一个非常简单的例子,仅供理解。

我有以下熊猫数据框:

import pandas as pd
df = pd.DataFrame({'A':pd.Series([1, 2, 13, 14, 25, 26, 37, 38])})
df 
        A
    0   1
    1   2
    2  13
    3  14
    4  25
    5  26
    6  37
    8  38

设置n = 3

第一个例子

如何获取新的数据框df1(以一种有效的方式),如下所示:

   D1  D2  D3     T
0   1   2  13    14
1   2  13  14    25
2  13  14  25    26
3  14  25  26    37
4  25  26  37    38

提示:将前 n 列视为 数据 (Dx),将最后一列视为 目标 (T)。在第一个示例中,目标(例如 25)取决于前面的 n 个元素(2、13、14)。

第二个例子

如果目标是前面的某个元素(例如+3)怎么办?

   D1  D2  D3     T
0   1   2  13    26
1   2  13  14    37
2  13  14  25    38

感谢您的帮助,
吉尔伯托

附:如果您认为标题可以改进,请建议我如何修改它。

更新

感谢@Divakar 和this post,滚动函数可以定义为:

import numpy as np
def rolling(a, window):
    shape = (a.size - window + 1, window)
    strides = (a.itemsize, a.itemsize)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)

a = np.arange(1000000000)
b = rolling(a, 4)

不到 1 秒!

【问题讨论】:

    标签: python pandas numpy dataframe scikit-learn


    【解决方案1】:

    我找到了另一种方法:view_as_windows

    import numpy as np
    from skimage.util.shape import view_as_windows
    window_shape = (4, )
    
    aa = np.arange(1000000000) # 1 billion!
    bb = view_as_windows(aa, window_shape)
    bb
    
    array([[        0,         1,         2,         3],
           [        1,         2,         3,         4],
           [        2,         3,         4,         5],
           ..., 
           [999999994, 999999995, 999999996, 999999997],
           [999999995, 999999996, 999999997, 999999998],
           [999999996, 999999997, 999999998, 999999999]])
    

    大约 1 秒。

    你怎么看?

    【讨论】:

      【解决方案2】:

      让我们看看如何使用 NumPy 工具解决这个问题。因此,让我们假设您将列数据作为 NumPy 数组,我们称之为a。对于这种滑动窗口操作,我们在 NumPy 中有一个非常有效的工具 strides,因为它们是 views 进入输入数组而不实际复制。

      让我们直接使用带有样本数据的方法并从案例#1开始-

      In [29]: a  # Input data
      Out[29]: array([ 1,  2, 13, 14, 25, 26, 37, 38])
      
      In [30]: m = a.strides[0] # Get strides
      
      In [31]: n = 3 # parameter
      
      In [32]: nrows = a.size - n # Get number of rows in o/p
      
      In [33]: a2D = np.lib.stride_tricks.as_strided(a,shape=(nrows,n+1),strides=(m,m))
      
      In [34]: a2D
      Out[34]: 
      array([[ 1,  2, 13, 14],
             [ 2, 13, 14, 25],
             [13, 14, 25, 26],
             [14, 25, 26, 37],
             [25, 26, 37, 38]])
      
      In [35]: np.may_share_memory(a,a2D) 
      Out[35]: True    # a2D is a view into a
      

      案例 #2 与 Target 列的附加参数类似 -

      In [36]: n2 = 3 # Additional param
      
      In [37]: nrows = a.size - n - n2 + 1
      
      In [38]: part1 = np.lib.stride_tricks.as_strided(a,shape=(nrows,n),strides=(m,m))
      
      In [39]: part1 # These are D1, D2, D3, etc.
      Out[39]: 
      array([[ 1,  2, 13],
             [ 2, 13, 14],
             [13, 14, 25]])
      
      In [43]: part2 = a[n+n2-1:] # This is target col
      
      In [44]: part2
      Out[44]: array([26, 37, 38])
      

      【讨论】:

      • 谢谢@Divakar 它有效。这对我来说有点难以理解,但这取决于我缺乏知识。我会研究你的解决方案。我想知道是否有熊猫指令的解决方案。
      • @Gilberto 这是一个基于广播的相关问题的解决方案,如果这更容易理解的话 - stackoverflow.com/a/40169790/3293881
      • 我看到了时间结果:太惊人了!绝对值得数小时的学习!再次感谢@Divakar。
      猜你喜欢
      • 2021-06-26
      • 2019-12-02
      • 2019-04-22
      • 2021-02-04
      • 2017-11-11
      • 2018-02-28
      • 2021-08-22
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多