如何将指定的Pandas DataFrame df转换为目标DataFrame df2?
解决方法:重塑Pandas DataFrame结构
嘿,这个需求属于典型的DataFrame结构重塑场景,我给你两种简洁靠谱的实现方式,都能完美得到你想要的df2:
方法一:melt + pivot组合(逻辑清晰易理解)
先把宽表转成“长格式”,再重新透视回目标结构,步骤一目了然:
import pandas as pd # 你的原始DataFrame df = pd.DataFrame(data=[['a1',2,3],['b1',4,5],['c1',6,7],['a1',8,9],['b1',10,11],['c1',12,13]],columns=['A','B','C'],index=[35,35,35,41,41,41]) # 步骤1:将B、C列转成长格式,新增临时列标记是B还是C melted_df = df.reset_index().melt(id_vars=['index', 'A'], var_name='temp_tag', value_name='value') # 步骤2:透视成目标结构,清理多余的索引层级 df2 = melted_df.pivot(index=['index', 'temp_tag'], columns='A', values='value') df2 = df2.reset_index(level=1, drop=True) # 移除临时标记的索引层 df2.columns.name = None # 去掉列名的层级标签
方法二:groupby + 转置T(代码更紧凑)
利用分组处理每个索引组内的数据,一行核心代码搞定:
import pandas as pd # 原始DataFrame df = pd.DataFrame(data=[['a1',2,3],['b1',4,5],['c1',6,7],['a1',8,9],['b1',10,11],['c1',12,13]],columns=['A','B','C'],index=[35,35,35,41,41,41]) # 按索引分组,组内将A设为索引后转置B/C列成为行,最后清理索引 df2 = df.groupby(level=0).apply(lambda group: group.set_index('A')[['B', 'C']].T) df2 = df2.reset_index(level=1, drop=True) df2.columns.name = None
验证结果
两种方法运行后,得到的df2输出完全匹配你的目标结构:
a1 b1 c1 35 2 4 6 35 3 5 7 41 8 10 12 41 9 11 13
内容的提问来源于stack exchange,提问作者gabboshow
相关产品推荐
相关产品推荐

