如何更高效地转换Pandas DataFrame的列与元素对应关系?
Pandas DataFrame 映射转置的高效实现方案
问题说明
现有如下Pandas DataFrame:
import pandas as pd list_dict = [{'good':'Ahmad', 'bad':'Reza', 'ugly':'Ali'}, {'good':'David', 'bad':'Frank', 'ugly':'Alice'}, {'good':'Ali', 'bad':'Alice', 'ugly':'Bob'}] df = pd.DataFrame(list_dict)
原结构展示:
good bad ugly 0 Ahmad Reza Ali 1 David Frank Alice 2 Ali Alice Bob
需要转换为以下格式:
Ahmad Reza Ali David Frank Alice Bob 0 good bad ugly NaN NaN NaN NaN 1 NaN NaN NaN good bad ugly NaN 2 NaN NaN good NaN NaN bad ugly
当前实现方式为逐行转字典、交换键值对后生成目标DataFrame,现寻求更高效的替代方案。
高效实现方法
方法1:melt + pivot 组合
利用Pandas内置的重塑函数,实现矢量化操作:
# 保留行索引信息 df = df.reset_index() # 宽表转长表,提取映射关系 melted_df = df.melt(id_vars='index', var_name='category', value_name='name') # 透视生成目标结构 result = melted_df.pivot(index='index', columns='name', values='category') # 重置索引并匹配目标列顺序(可选) result = result.reset_index(drop=True)[['Ahmad', 'Reza', 'Ali', 'David', 'Frank', 'Alice', 'Bob']]
方法2:stack + unstack 组合
更简洁的层级索引操作方式:
# 堆叠列到行,构建多级索引 stacked = df.stack() # 交换索引层级并反向透视 result = stacked.reset_index(level=1).set_index(0, append=True)['level_1'].unstack() # 重置行索引 result = result.reset_index(drop=True)
方案优势
两种方法均基于Pandas的矢量化引擎,避免了逐行循环和字典转换的额外开销,在数据量较大时性能提升显著,同时代码结构更简洁、易维护。
内容的提问来源于stack exchange,提问作者Mohammad Mohammadidoust
相关产品推荐
相关产品推荐

