如何在Pandas中将多行数据转为单行并按规则重命名列
问题
需要将DataFrame的多行数据转换为单行(扁平化处理),并将列名修改为「原列名_行索引」的格式,实现数据形状从(4,4)转换为(1,16)。
现有DataFrame定义:
data = {"a":[3,4,5,6], "b":[88,77,66,55], "c":["ts", "new", "thing", "here"], "d":[9.1,9.2,9.0,8.4]} df = pd.DataFrame(data)
当前DataFrame输出:
a b c d 0 3 88 ts 9.1 1 4 77 new 9.2 2 5 66 thing 9.0 3 6 55 here 8.4
期望的单行输出:
a_0 a_1 a_2 a_3 b_0 b_1 b_2 b_3 c_0 c_1 c_2 c_3 d_0 d_1 d_2 d_3 0 3 4 5 6 88 77 66 55 ts new thing here 9.1 9.2 9.0 8.4
解决方案
可以通过Pandas的层级索引操作实现需求,以下是两种简洁的实现方式:
方法一:分步操作(易理解)
# 将原DataFrame转置后展开所有行,得到多层索引的Series flat_series = df.T.unstack() # 把多层索引合并为「原列名_行索引」格式的列名 flat_series.index = [f"{col}_{row_idx}" for col, row_idx in flat_series.index] # 转换为单行DataFrame并重置索引 result_df = flat_series.to_frame().T
方法二:链式调用(简洁高效)
result_df = (df .stack() .unstack(0) .rename(columns=lambda x: f"{x[0]}_{x[1]}") .T .reset_index(drop=True))
步骤说明:
df.stack():将原DataFrame的列转为行层级,生成一个以(行索引, 列名)为多层索引的Seriesunstack(0):将原行索引转为列,此时列名是(原列名, 原行索引)的元组rename(columns=lambda x: f"{x[0]}_{x[1]}"):把列名元组重命名为「原列名_行索引」格式.T.reset_index(drop=True):转置后重置索引,最终得到形状为(1,16)的单行DataFrame
执行后result_df即为符合要求的输出。
内容的提问来源于stack exchange,提问作者Learner91
相关产品推荐
相关产品推荐

