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
相关产品推荐
相关产品推荐

