如何在Pandas中将数据转成目标布局?已尝试stack和wide_to_long无效
Pandas 数据布局转换解决方案
情况1:日期列单元格包含多指标字符串
如果你的初始数据中,001.2023、002.2023这类日期列的单元格是包含Price、Discounts、Quantity的结构化字符串(比如"Price:100, Discounts:0.1, Quantity:50"),可以按以下步骤处理:
步骤1:构造示例初始数据
import pandas as pd df_initial = pd.DataFrame({ 'Material': ['A', 'B'], 'Category': ['Cat1', 'Cat2'], '001.2023': ['Price:100, Discounts:0.1, Quantity:50', 'Price:80, Discounts:0.15, Quantity:30'], '002.2023': ['Price:120, Discounts:0.05, Quantity:60', 'Price:90, Discounts:0.1, Quantity:40'] })
步骤2:宽表转长表并解析指标
# 将日期列转为行,得到长表结构 df_melted = df_initial.melt(id_vars=['Material', 'Category'], var_name='Date', value_name='Metrics') # 解析Metrics字符串,拆分出三个指标列 def parse_metrics(metric_str): items = [item.split(':') for item in metric_str.split(',')] return pd.Series({k.strip(): float(v.strip()) for k, v in items}) df_melted[['Price', 'Discounts', 'Quantity']] = df_melted['Metrics'].apply(parse_metrics) # 整理最终结果,调整列顺序并移除冗余列 df_final = df_melted.drop('Metrics', axis=1)[['Material', 'Date', 'Category', 'Price', 'Discounts', 'Quantity']] # 可选:将Date格式转为标准年月格式(如'2023-01') df_final['Date'] = pd.to_datetime(df_final['Date'], format='%d.%Y').dt.strftime('%Y-%m')
最终输出的df_final就是以Material、Date为维度,Price、Discounts、Quantity为列的目标布局。
情况2:日期与指标组合为列名(如001.2023_Price)
如果你的初始数据实际是每个日期对应三个指标列(列名格式为日期_指标),只是表述简化了,那么用wide_to_long可以快速解决,之前没成功可能是参数设置有误:
步骤1:构造示例初始数据
df_initial = pd.DataFrame({ 'Material': ['A', 'B'], 'Category': ['Cat1', 'Cat2'], '001.2023_Price': [100, 80], '001.2023_Discounts': [0.1, 0.15], '001.2023_Quantity': [50, 30], '002.2023_Price': [120, 90], '002.2023_Discounts': [0.05, 0.1], '002.2023_Quantity': [60, 40] })
步骤2:使用wide_to_long转换布局
df_final = pd.wide_to_long( df_initial, stubnames=['Price', 'Discounts', 'Quantity'], # 指标前缀 i=['Material', 'Category'], # 保持不变的主键列 j='Date', # 拆分出的日期列名 sep='_', # 日期与指标的分隔符 suffix=r'\d+\.\d+' # 匹配日期格式的正则表达式 ).reset_index() # 可选:调整Date格式为标准年月 df_final['Date'] = pd.to_datetime(df_final['Date'], format='%d.%Y').dt.strftime('%Y-%m')
关键说明
- 用
stack未成功大概率是没先处理指标拆分步骤;wide_to_long失败则可能是stubnames、suffix参数与列名格式不匹配。 - 若初始数据指标存储格式不同(如JSON、列表),可调整解析逻辑,核心思路都是先转长表,再拆分指标。
内容的提问来源于stack exchange,提问作者william duran
相关产品推荐
相关产品推荐

