我有一个三列数据集,格式如下
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
效率不高。
答案 0 :(得分:5)
使用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]])
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
行都被删除了。