将DataFrame透视,使其包含列名
尝试导入一个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.Merge 和 pd.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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。