如何无循环优化实现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
相关产品推荐
相关产品推荐

