如何使用Pandas将多列合并为单列并复制其他列?
问题描述
有一个包含x1-x5和y1-y5列的Pandas DataFrame,需要将y1-y5合并为单列y,同时对应复制每一行的x1-x5数据,示例输入和期望输出如下:
示例输入DataFrame
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randint(10, size=60).reshape(6, 10)) df.columns = ['x1', 'x2', 'x3', 'x4', 'x5', 'y1', 'y2', 'y3', 'y4', 'y5']
初始DataFrame展示:
x1 x2 x3 x4 x5 y1 y2 y3 y4 y5 0 2 6 9 4 3 8 6 1 0 7 1 1 4 8 7 3 0 5 7 3 1 2 6 7 4 8 1 5 7 7 8 5 3 6 3 4 8 0 8 7 2 3 8 4 8 5 6 1 6 3 2 1 1 4 5 1 3 7 5 1 6 5 3 8 5
期望输出DataFrame
x1 x2 x3 x4 x5 y 0 2 6 9 4 3 8 1 1 4 8 7 3 0 2 6 7 4 8 1 5 3 6 3 4 8 0 8 4 8 5 6 1 6 3 5 1 3 7 5 1 6 6 2 6 9 4 3 6 7 1 4 8 7 3 5 8 6 7 4 8 1 7 9 6 3 4 8 0 7 10 8 5 6 1 6 2 11 1 3 7 5 1 5 12 2 6 9 4 3 1 13 1 4 8 7 3 7 14 6 7 4 8 1 7 15 6 3 4 8 0 2 16 8 5 6 1 6 1 17 1 3 7 5 1 3 18 2 6 9 4 3 0 19 1 4 8 7 3 3 20 6 7 4 8 1 8 21 6 3 4 8 0 3 22 8 5 6 1 6 1 23 1 3 7 5 1 8 24 2 6 9 4 3 7 25 1 4 8 7 3 1 26 6 7 4 8 1 5 27 6 3 4 8 0 8 28 8 5 6 1 6 4 29 1 3 7 5 1 5
解决方案
直接用Pandas内置的melt函数即可实现,不需要复杂逻辑。melt是专门用于宽表转长表的工具,参数说明:
id_vars:指定保持不变的列(即x1-x5)value_vars:指定需要合并的列(即y1-y5)value_name:指定合并后的目标列名,这里设为y
代码实现:
# 执行宽表转长表操作 result = df.melt(id_vars=['x1', 'x2', 'x3', 'x4', 'x5'], value_vars=['y1', 'y2', 'y3', 'y4', 'y5'], value_name='y') # 可选:如果需要和示例输出的行顺序完全一致,执行排序并重置索引 result = result.sort_values(by=['x1', 'x2', 'x3', 'x4', 'x5']).reset_index(drop=True)
执行后得到的result就是符合需求的长表结构,与期望输出完全匹配。
内容的提问来源于stack exchange,提问作者PJF49
相关产品推荐
相关产品推荐

