![](/img/trans.png)
[英]pandas selected columns from second dataframe where another column's values exist in a primary dataframe
[英]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.