Pandas中宽表转长表的替代实现方法咨询
Pandas中宽表转长表的替代实现方法咨询
嗨,看起来你已经用上了pd.melt这个宽转长的常用工具,但目前的结果里少了Name列对吧?这是因为你没把Name加入到id_vars参数里,先帮你把这个小问题修正,再给你介绍几种其他的宽转长实现方式~
首先先调整你现有的pd.melt代码,把Name也放到id_vars中,这样就能得到你想要的包含Name、Date、Variable、Value的目标长表了:
pd.melt(df, id_vars=["Name", "Date"], # 把Name也加入标识变量列表 value_vars=["A", "B", "C", "D"], var_name="Variable", value_name="Value")
接下来给你分享几种其他的实现思路:
方法1:使用DataFrame.stack()
stack()可以把列标签转换为索引的内层层级,非常适合这类多特征列转长表的场景,步骤如下:
- 先将
Name和Date设置为数据的索引,保留需要转换的A/B/C/D列 - 调用
stack()把列名转成内层索引 - 重置索引并给新列命名
代码示例:
(df.set_index(["Name", "Date"]) .stack() .reset_index(name="Value") .rename(columns={"level_2": "Variable"}))
方法2:使用pd.wide_to_long()
这个方法更适合列名有统一命名规则的场景,不过你的数据也可以适配使用。需要指定标识列、目标变量列名等参数:
pd.wide_to_long(df, stubnames=["A", "B", "C", "D"], i=["Name", "Date"], # 作为标识的列 j="Variable", # 转换后变量列的名称 sep="") # 列名没有分隔符,设为空字符串
如果你的列名是类似feat_A这种带统一前缀的格式,wide_to_long会更灵活顺手。
方法3:简化版melt(自动识别待转换列)
如果你的数据表中,除了Name和Date之外,剩下的列都是需要转成Variable的,那可以不用手动指定value_vars,让melt自动识别:
pd.melt(df, id_vars=["Name", "Date"], var_name="Variable", value_name="Value")
以上几种方法都能实现你要的宽表转长表效果,你可以根据自己的使用习惯和数据的实际情况来选择~
备注:内容来源于stack exchange,提问作者Cookfishbro
相关产品推荐
相关产品推荐

