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

Pandas实现DataFrame行转列并输出目标格式的解决方案

解决方案

问题说明

你需要把宽表结构的多列Name数据,按UNIT维度拆成每行一个名称的长表结构,同时过滤掉空的名称值。之前写的逐行迭代逻辑没有把每次循环生成的单行结果统一收集拼接,所以没法得到完整的最终表,而且逐行iterrows的写法性能很低,pandas原生提供了专门做长宽表转换的方法,不需要写循环。

实现思路

直接用pandas内置的melt方法做逆透视转换,三步就能得到结果:

  • 指定UNIT为固定不拆分的标识列
  • 把Name_1/Name_2/Name_3三列的内容统一拆成行,值存入Name列
  • 删除Name为空的行,调整列顺序即可

完整代码

import pandas as pd
import numpy as np

# 构造原始测试数据
data = {'UNIT': ['UNIT_1', 'UNIT_2', 'UNIT_3', 'UNIT_4'],
        'Name_1': ['werner', 'otto', 'karl', 'fritz'], 
        'Name_2': ['ottilie', 'anna', 'jasmin', ''],
        'Name_3': ['bello', 'kitti', '', '']}

df = pd.DataFrame(data)
df.replace('', np.nan, inplace=True)

# 核心转换逻辑
df_result = df.melt(
    id_vars='UNIT',
    value_vars=['Name_1', 'Name_2', 'Name_3'],
    value_name='Name'
).dropna(subset=['Name'])

# 调整列顺序、重置索引
df_result = df_result[['UNIT', 'Name']].reset_index(drop=True)

# 打印结果验证
print(df_result)

运行输出结果

UNIT     Name
0  UNIT_1   werner
1  UNIT_2     otto
2  UNIT_3     karl
3  UNIT_4    fritz
4  UNIT_1  ottilie
5  UNIT_2     anna
6  UNIT_3   jasmin
8  UNIT_1    bello
9  UNIT_2    kitti

和预期的目标结果结构完全一致。

补充:如果一定要用迭代写法实现,只需要在循环外初始化一个空列表,每次把处理好的单行转置结果append到列表里,循环结束后用pd.concat()把列表里的所有表拼接成一个完整DataFrame即可,但这种写法性能远不如melt,不推荐使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:57:32