簡體   English   中英

如何獲得大熊貓數據框,其中列是來自另一列數據框的后續n元素?

[英]How to get pandas dataframe where columns are the subsequent n-elements from another column dataframe?

一個非常簡單的示例,僅用於理解。

我有以下熊貓數據框:

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

謝謝您的幫助,
吉爾伯托

PS:如果您認為標題可以改進,請建議我如何修改它。

更新

感謝@Divakar, 本文的滾動功能可以定義為:

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秒!

讓我們看看如何使用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])

我找到了另一種方法: 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秒左右。

你怎么看?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM