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

使用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)

代码说明

  1. pivot函数的作用:这是pandas专门用于表格重塑的工具,index='aa'指定保持不变的列(其余列信息一致),columns='bb'指定要拆分成列的字段,values指定要按bb拆分的后续列(cc到nn)。
  2. 列名调整:默认pivot后的列是多层索引,我们把它改成原列名_小时数的格式,方便后续使用。
  3. 索引重置:如果不需要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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:10:52