python中列的数组范围

2024-04-28 23:16:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

    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')

我只想跑前三排,我可以像下面这样做

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是没有效率的。你知道吗


Tags: csv数据indfforshift格式range
1条回答
网友
1楼 · 发布于 2024-04-28 23:16:52

使用dict理解,构建列dict,创建临时数据帧并提取其值:

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]])

range0开始,因为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的行都被删除了。你知道吗

相关问题 更多 >