使用Pandas拆分列转多行并将列拆分为24列的代码问题排查
问题排查与优化方案
首先,咱们先拆解下你代码导致无输出的核心问题:
- 小时值不匹配:你的循环里
i是从0到23,但数据集里的bb列取值是1到24,所以np.where(dataframe.iloc[:,1]==i)根本找不到任何行,index_for_ith_hour_feature是空数组,后续的数值提取和拼接自然没法正常工作,最终输出为空。 - 逻辑冗余且无边界处理:嵌套循环+numpy拼接的方式不仅可读性差,还没处理空索引的情况,一旦索引为空,整个流程直接断裂。
- 日期列提取错误:最后提取
date_data_column时用的是最后一次循环的i对应的索引,而这个索引本身就是空的,导致拼接后的all_data没有有效数据。
接下来给你一个更简洁高效的pandas原生实现方案,完全贴合你的需求:
最优实现代码
import pandas as pd # 读取数据集,注意如果你的数据是空格分隔,把sep改成'\s+' df = pd.read_csv('dataset.csv', sep=',') # 确保bb列是整数类型,避免分组时出错 df['bb'] = df['bb'].astype(int) # 核心操作:用pivot实现列拆分 # index指定保持不变的列(aa),columns指定要拆成列的字段(bb),values指定要拆分的后续列 result = df.pivot( index='aa', columns='bb', values=['cc', 'dd', 'ee', 'ff', 'gg', 'hh', 'ii', 'jj', 'kk', 'll', 'mm', 'nn'] ) # 调整列名格式,变成cc_1、cc_2...cc_24这种直观形式 result.columns = [f'{col[0]}_{col[1]}' for col in result.columns] # 重置索引,把aa变回普通列(和原数据集结构对齐) result = result.reset_index() # 查看结果 print(result)
代码说明
- pivot函数的作用:这是pandas专门用于表格重塑的工具,
index='aa'指定保持不变的列(其余列信息一致),columns='bb'指定要拆分成列的字段,values指定要按bb拆分的后续列(cc到nn)。 - 列名调整:默认pivot后的列是多层索引,我们把它改成
原列名_小时数的格式,方便后续使用。 - 索引重置:如果不需要aa作为索引,用
reset_index()把它变回普通列,和原数据集结构保持一致。
效果验证
假设你的示例数据是:
aa, bb, cc, dd, ee 1, 1, 0.1, 0.3, 94 1, 2, 0.2, 0.4, 95 ... 1, 24, 0.24, 0.26, 117
运行代码后会得到:
aa cc_1 cc_2 ... cc_24 dd_1 dd_2 ... dd_24 ee_1 ee_2 ... ee_24 0 1 0.1 0.2 ... 0.24 0.3 0.4 ... 0.26 94 95 ... 117
这样就完美实现了你的需求:aa列保持一致,bb列的24个取值把cc、dd等列拆分成24个对应列,整个过程简洁高效,还避免了手动循环的各种坑。
内容的提问来源于stack exchange,提问作者user7670579
相关产品推荐
相关产品推荐

