如何透视DataFrame并将表头转为行,实现按企业查询在售产品
Pandas宽表转长表实现企业在售产品数据重构
问题背景
现有记录企业在售产品及供应商的数据集,原始结构如下:
Product Supplier Company1 Company2 0 1 1 x NaN 1 2 2 NaN x 2 3 3 NaN vx 3 4 4 fx x
构造该数据的Pandas代码:
import pandas as pd df = pd.DataFrame({ "Product": [1,2,3,4], "Supplier": [1,2,3,4], "Company1": ['x',None, None, 'fx'], "Company2": [None, 'x', 'vx','x'], })
需要将数据转换为可按企业名称查询在售产品的结构,期望输出:
Company Product Supplier Cells 0 Company1 1 1 x 1 Company1 4 4 fx 2 Company2 2 2 x 3 Company2 3 3 vx 4 Company2 4 4 x
此前尝试pd.merge和pd.pivot未成功,不清楚如何将表头转为行,寻求实现方法。
解决方法
这是典型的宽表转长表需求,使用Pandas的melt()函数即可高效实现,具体步骤:
- 调用
melt函数,指定id_vars为不需要转换的核心列(Product、Supplier),将企业列转为行数据,同时定义新列名; - 过滤掉
Cells列为NaN的行(对应企业未售卖的产品); - 重置索引保证连续性。
完整代码:
import pandas as pd df = pd.DataFrame({ "Product": [1,2,3,4], "Supplier": [1,2,3,4], "Company1": ['x',None, None, 'fx'], "Company2": [None, 'x', 'vx','x'], }) # 执行宽转长转换 transformed_df = df.melt( id_vars=['Product', 'Supplier'], var_name='Company', value_name='Cells' ) # 过滤无效数据并重置索引 final_df = transformed_df.dropna(subset=['Cells']).reset_index(drop=True) print(final_df)
运行后输出与期望格式完全匹配:
Company Product Supplier Cells 0 Company1 1 1 x 1 Company1 4 4 fx 2 Company2 2 2 x 3 Company2 3 3 vx 4 Company2 4 4 x
内容的提问来源于stack exchange,提问作者Cenderze
相关产品推荐
相关产品推荐

