【发布时间】:2021-09-26 03:14:33
【问题描述】:
假设我有以下系列:
inp = pd.Series(np.arange(10))
我想要做的是通过以下方式将其转换为np.array:
| input | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| 0 | NaN | NaN | NaN | Nan | 0 |
| 1 | NaN | NaN | NaN | 0 | 1 |
| 2 | NaN | NaN | 0 | 1 | 2 |
| 3 | NaN | 0 | 1 | 2 | 3 |
| 4 | 0 | 1 | 2 | 3 | 4 |
| 5 | 1 | 2 | 3 | 4 | 5 |
| 6 | 2 | 3 | 4 | 5 | 6 |
...等等。 输出中不应出现名为 input 的列,但我将其放在此处以使我的查询更加清晰。
我尝试的是以下内容:
matrix = [x.to_numpy() for x in list(inp.rolling(window=5, min_periods=5))]
问题是,我不能在matrix 上使用np.stack(),因为(即使我通过了min_periods=5)列表中每个项目的形状都不同。
我也觉得我忽略了一个非常简单的 pandas 命令:D。
非常感谢!
编辑: 我当前的解决方法是自定义函数。我想有比这个更好的解决方案:
def rolling_transform_series(x):
length = len(x)
array = []
for idx in range(length):
s = x[idx-5:idx]
if idx < 5:
s = np.r_[np.zeros(5-idx), x[:idx]]
s[s==0] = np.nan
array.append(s)
return np.array(array)
df = inp.apply(rolling_transform_series)
【问题讨论】:
标签: python pandas dataframe numpy rolling-computation