我正在尝试转换 Pandas 系列,例如:
日期
值(value)
2020-01-01
-1175
2020-01-02
-475
2020-01-03
1945年
2020-01-06
-1295
2020-01-07
-835
2020-01-08
-785
2020-01-09
895
2020-01-10
-665
进入 Pandas 数据帧,如:
日期
0
1
2
3
4
2020-01-01
-1175
-475
1945年
-1295
-665
2020-01-02
-475
1945年
-1295
-835
-785
2020-01-03
1945年
-1295
-835
-785
895
2020-01-06
-1295
-835
-785
895
-665
系列的每 5(或 n)行在 DataFrame 中形成一行。
示例数据以及我当前(丑陋但有效)的代码如下:
import pandas as pd
srs = pd.Series(index=pd.DatetimeIndex(pd.date_range(start="2020-01-01",end="2020-1-10",freq="B")),
data=[-1175,-475,1945,-1295,-835,-785,895,-665])
n = 5
df = pd.concat({i: srs.shift(-i) for i in range(n)}, axis=1).dropna()
df = df[range(n)]
df.index = df.index.droplevel(level=0)
我想知道是否有更好/更整洁/更好的方法来做到这一点?
最佳答案
试试 sliding_window_view
来自 numpy
:
n = 5
v = np.lib.stride_tricks.sliding_window_view(srs.values, n)
df = pd.DataFrame(v, index=srs.index[:v.shape[0]])
df
: 0 1 2 3 4
2020-01-01 -1175 -475 1945 -1295 -835
2020-01-02 -475 1945 -1295 -835 -785
2020-01-03 1945 -1295 -835 -785 895
2020-01-06 -1295 -835 -785 895 -665
完整的工作示例:
import numpy as np
import pandas as pd
srs = pd.Series(index=pd.DatetimeIndex(
pd.date_range(start="2020-01-01", end="2020-1-10", freq="B")
), data=[-1175, -475, 1945, -1295, -835, -785, 895, -665])
n = 5
v = np.lib.stride_tricks.sliding_window_view(srs.values, n)
df = pd.DataFrame(v, index=srs.index[:v.shape[0]])
print(df)
关于python - 将 Pandas 系列的每 n 行转换为 DataFrame 的 n 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67894012/