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
相关产品推荐
相关产品推荐

