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

如何在pandas中结构化并重塑格式损坏的DataFrame?

你这个问题的核心是原始DataFrame的第0行是错位的表头占位数据,实际业务数据从第1行开始,同时原本的dateID列实际存储的是sourceOfData字段的取值,表头中的日期字符串才是dateID的取值,直接用melt即可完成转换,完整处理代码如下:

import pandas as pd

# 你的原始DataFrame
whatIHave = {'countryName': ['','United States','Canada'],
        'provinceName': ['','New York','Ontario'],
        'productID': ['','35','55'],
        'productName': ['', 'Sugar', 'Corn'],
        'dateID': ['sourceOfData', 'CommissionAgent1', 'CommissionAgent1'],
        '2021-09-06': ['productPrice','2.6$','2.6$'],
        '2021-09-07': ['productPrice','5.5$','5.5$'],
        '2021-09-08': ['productPrice','3.4$','3.4$']
        }
df_whatIHave = pd.DataFrame(whatIHave, columns = ['countryName', 'provinceName', 'productID', 'productName', 'dateID', '2021-09-06', '2021-09-07', '2021-09-08'])

# 你预期的目标DataFrame,用于结果校验
whatINeed = {'countryName': ['United States','United States','United States', 'Canada', 'Canada', 'Canada'],
        'provinceName': ['New York','New York','New York', 'Ontario', 'Ontario', 'Ontario'],
        'productID': ['35','35','35', '55', '55', '55'],
        'productName': ['Sugar', 'Sugar', 'Sugar', 'Corn', 'Corn', 'Corn'],
        'sourceOfData': ['CommissionAgent1', 'CommissionAgent1', 'CommissionAgent1', 'CommissionAgent1', 'CommissionAgent1', 'CommissionAgent1'], 
        'dateID': ['2021-09-06', '2021-09-07', '2021-09-08', '2021-09-06', '2021-09-07', '2021-09-08'],
        'productPrice': ['2.6$','5.5$','3.4$','2.6$','5.5$','3.4$']
        }
df_whatINeed =  pd.DataFrame(whatINeed, columns = ['countryName', 'provinceName', 'productID', 'productName', 'sourceOfData', 'dateID', 'productPrice'])

# 核心处理逻辑
# 1. 重命名错位的dateID列为sourceOfData
df = df_whatIHave.rename(columns={'dateID': 'sourceOfData'})
# 2. 过滤掉第0行的占位表头数据,保留实际业务数据
df = df.iloc[1:].reset_index(drop=True)
# 3. 宽表转长表,把日期列转为行
df_result = df.melt(
    id_vars=['countryName', 'provinceName', 'productID', 'productName', 'sourceOfData'],
    var_name='dateID',
    value_name='productPrice'
)

# 验证结果和你预期的一致
print(df_result.equals(df_whatINeed)) # 输出True

如果你是直接从Excel文件读取得到的错位数据,可以在读Excel的时候直接跳过第一行占位表头,再手动指定列名,能减少后续处理步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:57:02