You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带日期索引的Pandas DataFrame按4列分割后纵向堆叠,能否用np.vstack()?

用np.vstack()实现按列分割后纵向堆叠Pandas DataFrame

当然可以用np.vstack()搞定这个需求!不过因为咱们操作的是带日期索引的Pandas DataFrame,得先做一点预处理,再结合NumPy的堆叠能力,最后转回DataFrame才能完美匹配你要的效果。我给你一步步拆解:

步骤1:先对齐你的场景(模拟原始数据)

假设你的DataFrame是日期索引,列数是4的倍数(比如12列,分成3组),先模拟一个样例方便理解:

import pandas as pd
import numpy as np

# 生成日期索引和随机数据
dates = pd.date_range('2023-01-01', periods=5)
df = pd.DataFrame(np.random.randn(5, 12), index=dates, columns=[f'col_{i+1}' for i in range(12)])

步骤2:按每4列分割DataFrame

用列表推导式把原DataFrame切成多个子DataFrame,每个子DataFrame保留4列:

# 按步长4遍历列索引,分割出每4列的子DataFrame
split_dfs = [df.iloc[:, i:i+4] for i in range(0, df.shape[1], 4)]

步骤3:统一子DataFrame的列名

因为堆叠后列名要一致才能保证结构正确,所以给每个子DataFrame设置相同的列名:

for sub_df in split_dfs:
    sub_df.columns = ['Col1', 'Col2', 'Col3', 'Col4']

步骤4:用np.vstack()完成纵向堆叠

把每个子DataFrame的数值部分提取出来,用np.vstack()堆叠,再重构索引和列名得到最终结果:

# 堆叠所有子DataFrame的数值数组
stacked_values = np.vstack([sub_df.values for sub_df in split_dfs])

# 构造重复的日期索引:每个原始日期对应每一组分割结果
new_index = np.repeat(df.index, len(split_dfs))

# 生成最终的目标DataFrame
result_df = pd.DataFrame(stacked_values, index=new_index, columns=['Col1', 'Col2', 'Col3', 'Col4'])

补充:更简洁的Pandas原生方法

如果你不想依赖NumPy,直接用pd.concat()也能实现相同效果,代码更短:

result_df = pd.concat(split_dfs, axis=0)

不过既然你明确问了np.vstack(),上面的方法完全满足你的需求——本质是用NumPy处理数值堆叠,再套回Pandas的索引和列结构,完美匹配你的目标效果。

内容的提问来源于stack exchange,提问作者alan centaur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:46:55