基于列名创建新列并转换行顺序的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
相关产品推荐
相关产品推荐

