如何使用pandas.melt无需指定列获取所有变量的全部对应值
最简解法:直接使用pd.melt,无需手动指定列
pd.melt默认会把输入DataFrame的所有列作为待转换的变量列,不需要手动传入id_vars和value_vars参数,只需要指定输出的列名即可:
# 基础转换,输出列名为var和value res = pd.melt(df1, var_name='var', value_name='value')
如果需要和你示例中的输出顺序完全一致(按原始行的顺序逐行展开所有变量),只需要额外加一步排序即可:
# 按原始行顺序展开,最终输出和你给出的示例结构、顺序完全一致 res = ( pd.melt(df1.reset_index(), id_vars='index', var_name='var', value_name='value') .sort_values(['index', 'var']) .drop('index', axis=1) .reset_index(drop=True) )
可选方案:使用pd.wide_to_long实现
如果你的列名都是固定的var+数字格式,也可以用wide_to_long实现同样效果,同样不需要枚举所有列:
res = ( pd.wide_to_long(df1.reset_index(), stubnames='var', i='index', j='var_num') .reset_index() .sort_values(['index', 'var_num']) .rename(columns={'var': 'value'}) .assign(var=lambda x: 'var' + x['var_num'].astype(str)) .drop(['index', 'var_num'], axis=1) .reset_index(drop=True) )
内容的提问来源于stack exchange,提问作者ire
相关产品推荐
相关产品推荐

