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

Jupyter Notebook中Pandas DataFrame宽表转长表及多条件排序实现咨询

解决方案:将宽格式产品数据转换为整合的长格式表格

嘿,这个需求用Pandas的melt函数就能轻松搞定,而且代码超好维护,完全不用手动挨个处理产品列!我给你一步步拆解:

步骤1:自动识别产品列(适配产品增减)

首先我们不用硬写product 1到product 40,而是通过列名前缀自动匹配所有产品列——这样以后产品增删都不用改代码,维护起来超省心:

# 获取所有以"product "开头的列
product_cols = [col for col in df.columns if col.startswith('product ')]

步骤2:将宽表转长表

用pd.melt把分散的产品列合并成Product_name和product value两列,同时保留你需要的基础信息列:

# 转换格式:宽表转长表
melted_df = pd.melt(
    df,
    id_vars=['number', 'name', 'street', 'time', 'day'],  # 要保留的基础列
    value_vars=product_cols,  # 需要转换的产品列
    var_name='Product_name',  # 新列:产品名称(对应原列名)
    value_name='product value'  # 新列:产品的具体值
)

步骤3:筛选非空行并固定产品顺序

这一步解决两个核心需求:

  • 过滤掉产品值为空的行(和你之前的dropna逻辑完全一致)
  • 避免product 10排在product 2前面的排序混乱问题(通过把产品列设为有序类别实现)
# 筛选产品值非空的行
melted_df = melted_df.dropna(subset=['product value'])

# 固定Product_name的排序(和原始DataFrame中的产品列顺序保持一致)
melted_df['Product_name'] = pd.Categorical(
    melted_df['Product_name'],
    categories=product_cols,  # 用原始产品列的顺序作为类别排序依据
    ordered=True
)

步骤4:排序并导出整合文件

最后按day和time升序排序,同时因为我们已经固定了Product_name的顺序,同天同时间的产品会严格按照原始列顺序排列,完全符合你的要求:

# 按day、time排序,同时保证Product_name的顺序不乱
sorted_df = melted_df.sort_values(by=['day', 'time', 'Product_name'], ascending=True)

# 导出为整合的Excel文件
sorted_df.to_excel('integrated_products.xlsx', index=False)

为什么这个方案适合你?

  • 无需手动维护产品列:自动识别所有product 开头的列,产品增删都不用改代码
  • 逻辑清晰易维护:每一步都是简单的Pandas基础操作,哪怕编程能力有限的维护人员也能看懂
  • 完美解决排序混乱问题:通过有序类别彻底避免字符串排序的坑

内容的提问来源于stack exchange,提问作者Jordy Van Vliet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 15:37:34