You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无循环优化实现Pandas DataFrame转自定义列名单行数据

问题描述

我有如下Pandas DataFrame:

x   y   z
0   a   d   g
1   b   e   h
2   c   f   i

希望将其转换为单行DataFrame,新列名为原列名与原行索引的组合(格式为列名_行索引),且列顺序按原列倒序、行索引倒序排列,目标结果如下:

z_2 z_1 z_0 y_2 y_1 y_0 x_2 x_1 x_0
0   i   h   g   f   e   d   c   b   a

我已通过循环实现该功能,但需要优化代码运行性能,尽可能避免使用循环。现有实现代码如下:

df = pd.DataFrame({"x": ["a", "b", "c"],
                    "y": ["d", "e", "f"],
                    "z": ["g", "h", "i"]})
df.to_dict()
wantedRes = pd.DataFrame()
for key, value in df.items():
    for key2, value2 in value.items():
        wantedRes.insert(loc = 0, column = str(key) + "_" + str(key2),value = [value2] ) 
无循环优化实现

可以利用Pandas的内置数据重塑方法高效完成,完全避免循环,代码更简洁且性能更优:

import pandas as pd

df = pd.DataFrame({"x": ["a", "b", "c"],
                   "y": ["d", "e", "f"],
                   "z": ["g", "h", "i"]})

# 步骤拆解实现
# 1. 反转原DataFrame的列顺序(得到z、y、x)
# 2. 堆叠所有列的行数据,生成带(列名, 行索引)多级索引的Series
stacked_series = df.loc[:, ::-1].stack()
# 3. 反转Series的元素顺序,让每个列对应的行索引从2到0排列
reversed_series = stacked_series.iloc[::-1]
# 4. 将多级索引重命名为"列名_行索引"格式
reversed_series.index = reversed_series.index.map(lambda idx: f"{idx[0]}_{idx[1]}")
# 5. 转置为单行DataFrame
result = reversed_series.to_frame().T

也可以写成更紧凑的链式调用:

result = (df.loc[:, ::-1]
          .stack()
          .iloc[::-1]
          .set_axis([f"{col}_{idx}" for col, idx in reversed(stacked_series.index)])
          .to_frame().T)

代码说明

  • df.loc[:, ::-1]:快速反转列的顺序,确保后续先处理z、再y、最后x
  • .stack():将每列的行数据堆叠成一维Series,自动生成(列名, 行索引)的多级索引,避免手动遍历
  • .iloc[::-1]:反转Series的元素顺序,让每个列对应的行索引从2到0排列
  • 索引重命名:通过map将多级索引拼接成列名_行索引的格式
  • .to_frame().T:将Series转换为单行DataFrame,得到最终目标结构

这种方式依赖Pandas的底层优化实现,比循环插入列的效率高很多,尤其是当DataFrame的行/列数量较多时,性能提升会非常明显。

内容的提问来源于stack exchange,提问作者Florian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:57:16