Skip to main content
 首页 » 编程设计

python之python pandas 中列的数组范围

2025年05月04日23pander-it

我有一个三列数据集,格式如下

    t_stamp,Xval,Ytval 
    0.000543,0,10 
    0.000575,0,10 
    0.041324,1,10 
    0.041331,2,10 
    0.041336,3,10 
    0.04134,4,10 
    0.041345,5,10 
    0.04135,6,10 
    0.041354,7,10 
 
 
df = pd.read_csv('test.csv') 

我想只运行前 3 行,我可以像下面那样做

for i in range(1,4): 
    df['X_t'+str(i)] = df['X'].shift(i) 
X = df[['X', 'X_t1', 'X_t2', 'X_t3']].values 

如果我想做 5 个范围,我可以像下面那样做

for i in range(1,6): 
        df['X_t'+str(i)] = df['X'].shift(i) 
    X = df[['X', 'X_t1', 'X_t2', 'X_t3', 'X_t4', 'X_t5']].values 

但是,如果我们想在更高的范围内运行它,这就没有效率了。我怎样才能自动化,这样我们就不必手动将 X 的值分配为 X = df[['X', 'X_t1', 'X_t2', 'X_t3']].values假设我们要运行 1000 个范围?执行 X = df[['X', 'X_t1', 'X_t2', 'X_t3', 'X_t4', ..., 'X_1000']].values 效率不高。

请您参考如下方法:

使用字典理解,构建列字典,创建临时数据框并提取其值:

In [1679]: pd.DataFrame({ 'X_%d'%i : df['Xval'].shift(i) for i in range(5)}).values 
Out[1679]:  
array([[  0.,  nan,  nan,  nan,  nan], 
       [  0.,   0.,  nan,  nan,  nan], 
       [  1.,   0.,   0.,  nan,  nan], 
       [  2.,   1.,   0.,   0.,  nan], 
       [  3.,   2.,   1.,   0.,   0.], 
       [  4.,   3.,   2.,   1.,   0.], 
       [  5.,   4.,   3.,   2.,   1.], 
       [  6.,   5.,   4.,   3.,   2.], 
       [  7.,   6.,   5.,   4.,   3.]]) 

同样,

In [1680]: pd.DataFrame({ 'X_%d'%i : df['Xval'].shift(i) for i in range(10)}).values 
Out[1680]:  
array([[  0.,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan], 
       [  0.,   0.,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan], 
       [  1.,   0.,   0.,  nan,  nan,  nan,  nan,  nan,  nan,  nan], 
       [  2.,   1.,   0.,   0.,  nan,  nan,  nan,  nan,  nan,  nan], 
       [  3.,   2.,   1.,   0.,   0.,  nan,  nan,  nan,  nan,  nan], 
       [  4.,   3.,   2.,   1.,   0.,   0.,  nan,  nan,  nan,  nan], 
       [  5.,   4.,   3.,   2.,   1.,   0.,   0.,  nan,  nan,  nan], 
       [  6.,   5.,   4.,   3.,   2.,   1.,   0.,   0.,  nan,  nan], 
       [  7.,   6.,   5.,   4.,   3.,   2.,   1.,   0.,   0.,  nan]]) 

range 从 0 开始,因为 df.shift(0) 就是 X,这是你想要的

如果你想替换那些 nan 值,你可以先使用 df.fillna(0),然后然后提取它的值:

pd.DataFrame({ 'X_%d'%i : df['Xval'].shift(i) for i in range(5)}).fillna(0).values 

或者,应用np.nan_to_num:

pd.DataFrame({ 'X_%d'%i : df['Xval'].shift(i) for i in range(5)}).apply(np.nan_to_num, axis=0).values 

或者,使用 dropna,如果您对数据帧被截断没有问题:

In [1763]: pd.DataFrame({ 'X_%d'%i : df['Xval'].shift(i) for i in range(5)}).dropna().values 
Out[1763]:  
array([[ 3.,  2.,  1.,  0.,  0.], 
       [ 4.,  3.,  2.,  1.,  0.], 
       [ 5.,  4.,  3.,  2.,  1.], 
       [ 6.,  5.,  4.,  3.,  2.], 
       [ 7.,  6.,  5.,  4.,  3.]]) 

将此与第一个示例进行比较,所有带有 nan 的行都被删除。