如何将Pandas DataFrame所有列合并为一列并保留索引
Pandas DataFrame 转置为纵向分组格式问题
原始数据
我有一个结构如下的Pandas DataFrame(df1):
| Job | Machine | command | Time |
|---|---|---|---|
| One | Moon | sleep | 12:00 |
| Two | Jupiter | python | 13:00 |
目标格式
希望将其转换为以下纵向分组格式(首行仅为表格编辑需求,实际导出无表头),以便用df1.to_html()导出:
| Attribute | Value |
|---|---|
| Job | One |
| Machine | Moon |
| command | Sleep |
| Time | 12:00 |
| Job | Two |
| Machine | Jupiter |
| Command | python |
| Time | 13:00 |
尝试过的方法
- 使用
df1.T转置:结果接近但无法复制索引并调整列结构 - 使用
df1.T.stack():无法生成独立的索引序列 - 使用
pd.wide_to_long:未取得预期进展 - 使用
pd.melt(df1.T):右侧值符合要求,但左侧丢失了需要重复的原列名索引
解决方案
可以通过转置、索引重置与重复拼接的组合操作实现需求,具体代码如下:
方法一:分步实现
import pandas as pd # 构造原始DataFrame df1 = pd.DataFrame({ 'Job': ['One', 'Two'], 'Machine': ['Moon', 'Jupiter'], 'command': ['sleep', 'python'], 'Time': ['12:00', '13:00'] }) # 1. 转置并重置索引,将原列名转为第一列 transposed_df = df1.T.reset_index() # 2. 重复索引标签(对应原DataFrame的行数) attribute_col = transposed_df['index'].repeat(len(df1)) # 3. 提取所有值并转为一维数组 value_col = transposed_df.drop('index', axis=1).values.flatten() # 4. 构建最终DataFrame result_df = pd.DataFrame({'Attribute': attribute_col, 'Value': value_col}) # 导出为HTML(无表头、无索引) html_output = result_df.to_html(header=False, index=False)
方法二:链式操作(更简洁)
result_df = (df1.T .reset_index() .assign(index=lambda x: x['index'].repeat(len(df1))) .melt(id_vars='index', value_name='Value') .drop('variable', axis=1) .rename(columns={'index': 'Attribute'}) .reset_index(drop=True))
生成的result_df完全匹配目标格式,导出的HTML也会和你需要的结构一致。
内容的提问来源于stack exchange,提问作者Demo
相关产品推荐
相关产品推荐

