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

基于列名创建新列并转换行顺序的Dataframe处理需求

问题与解决方案

问题描述

我有一个名为TV-Channels的DataFrame,结构如下:

Channel      Code    14-D1    14-D2    15-D1    15-D2     16-D1    16-D2
Tv1           1       0,32     0,51    0,65      0,43      0,43     0,23
Tv2           2       0,46     0,24    0,25      0,53      0,53     0,85
Tv3           3       0,58     0,45    0,67      0,78      0,23     0,46
BBC           B       0,53     0,56    0,76      0,32      0,65     0,87
CNN           C       0,24     0,65    0,76      0,34      0,43     0,76
TheGuardian   T       0,11     0,76    0,14      0,32      0,32     0,43
#With 25 more rows

需要基于现有列名创建Number和D-code两个新列,并将数据转换为长表格式,最终结果如下:

Channel    Code   Number  D-code   Cost
Tv1         1       14      D1     0,32
Tv1         1       14      D2     0,51
Tv1         1       15      D1     0,65
Tv1         1       15      D2     0,43
Tv1         1       16      D1     0,43
Tv1         1       16      D2     0,23
Tv2         2       14      D1     0,46
Tv2         2       14      D2     0,24
Tv2         2       15      D1     0,25
Tv2         2       15      D2     0,53
Tv2         2       16      D1     0,53
Tv2         2       16      D2     0,85
#With 150 more rows

实现思路

Python(Pandas)方案

  • 转长表:用pd.melt()把宽表转为长表,保留Channel和Code作为标识列,其余列转为Cost值列,同时生成临时列存储原列名:
    import pandas as pd
    
    # 读取数据,指定小数分隔符为逗号
    df = pd.read_csv("你的数据路径", sep="\s+", decimal=",")
    # 转长表
    melted_df = df.melt(id_vars=["Channel", "Code"], var_name="temp_col", value_name="Cost")
    
  • 拆分列生成Number和D-code:对临时列按-拆分,得到两个新列,再删除临时列:
    # 拆分临时列
    melted_df[["Number", "D-code"]] = melted_df["temp_col"].str.split("-", expand=True)
    # 把Number转为整数类型(可选)
    melted_df["Number"] = melted_df["Number"].astype(int)
    # 删除临时列
    melted_df.drop("temp_col", axis=1, inplace=True)
    
  • 调整列顺序(可选):如果需要和目标结果列顺序一致,重新排列:
    final_df = melted_df[["Channel", "Code", "Number", "D-code", "Cost"]]
    

R(tidyr + dplyr)方案

  • 转长表并拆分列:用pivot_longer()转长表,再用separate()拆分原列名得到Number和D-code:
    library(tidyr)
    library(dplyr)
    
    # 读取数据,指定小数分隔符为逗号
    df <- read.table("你的数据路径", header=TRUE, sep=" ", dec=",")
    # 转换格式并整理列顺序
    final_df <- df %>%
      pivot_longer(cols = -c(Channel, Code), names_to = "temp_col", values_to = "Cost") %>%
      separate(temp_col, into = c("Number", "D-code"), sep = "-") %>%
      select(Channel, Code, Number, `D-code`, Cost)
    

内容的提问来源于stack exchange,提问作者Sara Dwindler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:01:06