带日期索引的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
相关产品推荐
相关产品推荐

