python - Pandas 以 .rolling() 方式将列转换为行
问题描述
想象一下我有以下系列:
inp = pd.Series(np.arange(10))
我想要做的是np.array
通过以下方式将其转换为:
输入 | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
0 | 钠 | 钠 | 钠 | 楠 | 0 |
1 | 钠 | 钠 | 钠 | 0 | 1 |
2 | 钠 | 钠 | 0 | 1 | 2 |
3 | 钠 | 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))]
问题是,我不能使用np.stack()
on matrix
,因为(即使我通过了min_periods=5
)列表中每个项目的形状都不同。我也觉得我忽略了一个非常简单的熊猫命令: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)
解决方案
你可以用 shift 试试:
import pandas as pd
inp = pd.Series(np.arange(10))
pd.DataFrame([inp.shift(s) for s in range(4,-6,-1)])
0 1 2 3 4 5 6 7 8 9
0 NaN NaN NaN NaN 0.0 1.0 2.0 3.0 4.0 5.0
1 NaN NaN NaN 0.0 1.0 2.0 3.0 4.0 5.0 6.0
2 NaN NaN 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0
3 NaN 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0
4 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0
5 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 NaN
6 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 NaN NaN
7 3.0 4.0 5.0 6.0 7.0 8.0 9.0 NaN NaN NaN
8 4.0 5.0 6.0 7.0 8.0 9.0 NaN NaN NaN NaN
9 5.0 6.0 7.0 8.0 9.0 NaN NaN NaN NaN NaN
推荐阅读
- django - 从 Django 创建 websocket 连接
- sveltekit - 是否可以使用 svelte-kit 为 ./routes 中的子目录创建 _layout.svelte?
- python - 从 for 循环内递增
- javascript - 为什么 chrome.storage.sync.set 不能立即加载用户设置?
- git - Azure Pipelines 错误:pathspec 'refs/remotes/origin/master' 与 git 已知的任何文件都不匹配
- c# - C# - 在 Linq Where Any 语句中使用的要列出的字符串
- python - 使用 Pandas 为间隙添加容差
- javascript - 我找到了一个符合我兴趣的 jquery 代码。我的问题是我希望将此 jquery 代码转换为本机 javascript。答案赞赏
- ffmpeg - 如何使用 ffmpeg 将视频 720:1280 更大的高度、宽度和裁剪调整为 1280:720?
- django - 如何使用 Ngnix 和 GUnicorn 在单个服务器上部署多个 Django 应用程序?