Wad*_*ade 4 python python-3.x pandas
所以我有一个看起来像这样的数据框:
#1 #2
1980-01-01 11.6985 126.0
1980-01-02 43.6431 134.0
1980-01-03 54.9089 130.0
1980-01-04 63.1225 126.0
1980-01-05 72.4399 120.0
Run Code Online (Sandbox Code Playgroud)
我想要做的是将第一列 (11.6985) 的第一行向下移动 1 行,然后将第一列 (72.4399) 的最后一行移动到第一行第一列,如下所示:
#1 #2
1980-01-01 72.4399 126.0
1980-01-02 11.6985 134.0
1980-01-03 43.6431 130.0
1980-01-04 54.9089 126.0
1980-01-05 63.1225 120.0
Run Code Online (Sandbox Code Playgroud)
这个想法是我想使用这些数据框为每个班次找到一个 R^2 值,所以我需要使用所有数据,否则它可能不起作用。我曾尝试使用pandas.Dataframe.shift():
print(data)
#Output
1980-01-01 11.6985 126.0
1980-01-02 43.6431 134.0
1980-01-03 54.9089 130.0
1980-01-04 63.1225 126.0
1980-01-05 72.4399 120.0
print(data.shift(1,axis = 0))
1980-01-01 NaN NaN
1980-01-02 11.6985 126.0
1980-01-03 43.6431 134.0
1980-01-04 54.9089 130.0
1980-01-05 63.1225 126.0
Run Code Online (Sandbox Code Playgroud)
所以它只是向下移动两列并去掉最后一行数据,这不是我想要的。
有什么建议吗?
不确定性能,但您可以尝试numpy.roll:
import numpy as np
print(df.apply(np.roll, shift=1))
# #1 #2
#1980-01-01 72.4399 120.0
#1980-01-02 11.6985 126.0
#1980-01-03 43.6431 134.0
#1980-01-04 54.9089 130.0
#1980-01-05 63.1225 126.0
Run Code Online (Sandbox Code Playgroud)
#1仅移动列:
df['#1'] = np.roll(df['#1'], shift=1)
print(df)
# #1 #2
#1980-01-01 72.4399 126.0
#1980-01-02 11.6985 134.0
#1980-01-03 43.6431 130.0
#1980-01-04 54.9089 126.0
#1980-01-05 63.1225 120.0
Run Code Online (Sandbox Code Playgroud)
我不认为你可以用shift来做到这一点,但一种方法是使用iloc:
In [11]: res = df.iloc[np.arange(-1, len(df)-1)]
In [12]: res
Out[12]:
#1 #2
1980-01-05 72.4399 120.0
1980-01-01 11.6985 126.0
1980-01-02 43.6431 134.0
1980-01-03 54.9089 130.0
1980-01-04 63.1225 126.0
In [13]: res.index = df.index
In [14]: res
Out[14]:
#1 #2
1980-01-01 72.4399 120.0
1980-01-02 11.6985 126.0
1980-01-03 43.6431 134.0
1980-01-04 54.9089 130.0
1980-01-05 63.1225 126.0
Run Code Online (Sandbox Code Playgroud)
如果您希望将其作为新列(仅适用于#1):
In [21]: df.iloc[np.arange(-1, len(df)-1), 0]
Out[21]:
1980-01-05 72.4399
1980-01-01 11.6985
1980-01-02 43.6431
1980-01-03 54.9089
1980-01-04 63.1225
Name: #1, dtype: float64
In [22]: df.iloc[np.arange(-1, len(df)-1), 0].values
Out[22]: array([ 72.4399, 11.6985, 43.6431, 54.9089, 63.1225])
In [23]: df["new#1"] = df.iloc[np.arange(-1, len(df)-1), 0].values
In [24]: df
Out[24]:
#1 #2 new#1
1980-01-01 11.6985 126.0 72.4399
1980-01-02 43.6431 134.0 11.6985
1980-01-03 54.9089 130.0 43.6431
1980-01-04 63.1225 126.0 54.9089
1980-01-05 72.4399 120.0 63.1225
Run Code Online (Sandbox Code Playgroud)