Pandas合并DataFrame两列为单列新行并保留其余列值
Pandas多列合并为单列(保留匹配字段)实现方案
你之前的转换逻辑核心是「将不需要拆分的字段设为索引,再通过stack()实现宽表转长表」,新增date字段后转换失败,本质是设置索引时漏了date字段,导致date被当成需要拆分的学生姓名字段处理了。
沿用原有stack逻辑的修正代码
只需要将date和id同时设为索引,其余逻辑和你之前写的完全一致即可:
stu_df = stu_df.set_index(['date', 'id']).stack().reset_index(level=2, drop=True).to_frame('stu').reset_index()
运行后直接得到包含date、id、stu三列的结果,同一行的date、id会自动和拆分后的两个姓名一一匹配重复。
更适合初学者的替代方案(melt方法)
如果觉得stack的索引层级逻辑不好理解,可以用语义更直观的melt()宽转长方法,不需要操作索引:
stu_df = stu_df.melt( id_vars=['date', 'id'], # 指定要保留、不做拆分的列,拆分时自动重复匹配 value_vars=['stu1', 'stu2'], # 指定要合并为单列的字段 value_name='stu' # 指定合并后存储姓名的列名 ).drop('variable', axis=1) # 删掉自动生成的原列名标记列
两种方法得到的结果完全一致,你可以根据自己的理解习惯选择。
效果验证
用测试数据跑通后的结果示例:
输入样例:
| date | id | stu1 | stu2 |
|---|---|---|---|
| 2024-01-01 | 11 | 张三 | 王五 |
| 2024-01-02 | 22 | 李四 | 赵六 |
转换后输出:
| date | id | stu |
|---|---|---|
| 2024-01-01 | 11 | 张三 |
| 2024-01-01 | 11 | 王五 |
| 2024-01-02 | 22 | 李四 |
| 2024-01-02 | 22 | 赵六 |
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

