如何高效重塑Pandas DataFrame?求替代pd.wide_to_long的简便方案
Pandas宽表转长表的高效实现方法
给定输入DataFrame:
import pandas as pd inputTable = pd.DataFrame({ 'A' : [1, 2, 3, 4, 5], 'B' : [2, 3, 4, 5, 6], 'C' : [3, 4, 5, 6, 7] })
需要转换为如下长表结构:
resultingTable = pd.DataFrame({ 'Category' : ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C'], 'Value' : [1, 2, 3, 4, 5, 2, 3, 4, 5, 6, 3, 4, 5, 6, 7] })
已知pd.wide_to_long()在此场景下过于冗余,除了pd.melt(),以下是几种更简洁高效的实现方式:
方法1:使用stack()方法
stack()是处理宽表转长表的轻量方法,尤其适合这种无额外索引的简单场景:
# 链式写法一步到位 output = (inputTable.stack() .reset_index(name='Value') .drop('level_0', axis=1) .rename(columns={'level_1': 'Category'}))
stack()会将列标签转为行索引的一部分,后续通过reset_index()将其转回列,再调整列名即可得到目标结构。
方法2:简化版pd.melt()
pd.melt()本身就是为宽转长场景设计的,写法可以极度简洁:
output = pd.melt(inputTable, var_name='Category', value_name='Value')
直接指定var_name(原列名对应的新列名)和value_name(原数值对应的新列名),一行代码完成转换。
方法3:实例方法版melt()
与上面的pd.melt()逻辑完全一致,只是以DataFrame实例方法的形式调用,更符合面向对象的编码习惯:
output = inputTable.melt(var_name='Category', value_name='Value')
效率说明
在小规模数据集上,这些方法的性能差异可以忽略;但处理大规模数据时,stack()和简化版melt()都比wide_to_long()更高效,因为不需要处理复杂的参数映射逻辑。
内容的提问来源于stack exchange,提问作者striatum
相关产品推荐
相关产品推荐

