将DataFrame透视,使其包含列名

后端开发 2026-07-09

尝试导入一个Excel表格,其中每个 Product 表示某家企业销售的产品,并记录该企业实际销售的哪些产品。并非每家企业都销售所有产品。数据看起来像这样:

   Product  Supplier Company1 Company2
0        1         1        x      NaN
1        2         2      NaN        x
2        3         3      NaN       vx
3        4         4       fx        x
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'],
    })

我想把数据导入到一个第三方解决方案,并希望对数据进行透视,以便通过查询公司名称来查看它所销售的所有产品。

这是否可实现?我尝试使用 pd.Mergepd.Pivot,但未成功,不过我不确定自己是否理解正确。也不清楚如何用这种技术将表头名称转换成行。

    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

解决方案

你要做的是所谓的解透视(unpivoting)——将列转换为行。这可以通过 pd.melt 实现。

你可以用下面的方法得到你想要的结果:

df_unpivoted = (
    df.melt(
          id_vars=["Product","Supplier"],
          value_vars=["Company1","Company2"],
          var_name="Company",
          value_name="Cells")
      .dropna()
      .reset_index(drop=True)
)
---
   Product  Supplier   Company Cells
0        1         1  Company1     x
1        4         4  Company1    fx
2        2         2  Company2     x
3        3         3  Company2    vx
4        4         4  Company2     x

value_vars 指定哪些列将成为值列。dropna 之所以需要,是因为某些组合没有值,因此 Cells 将会是 NaN。生成的DataFrame将保留原始索引。要获得一个新的自增索引,你需要 reset_index(drop=True)

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章