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

如何用Pandas重塑/重定位DataFrame?尝试后结果异常求方案

问题:将DataFrame重塑为指定多列索引结构

我有一个名为df的DataFrame,数据结构如下,希望将其重塑为带有多列索引的目标结构df2。尝试编写了代码但得到异常结果,附上代码寻求解决方案:

# initialize data of lists.

data = {'Source': ['Rainfall', 'SP2', 'SP2', 'Inflow','Rainfall','Inflow', 'Inflow', 'Inflow','SWT','SP1','SP1','SWD'],
        'Target': ['SP1', 'Evp', 'Outflow', 'SP2','SWD','SWD', 'SP2','SP1','SP1','SP2','Evp','Loss']}  

#Create DataFrame
df = pd.DataFrame(data)

#Defined variables

vals = ['SP1', 'SWD', 'SP2']

tmp = (df.mask(df['Target'].isin(vals))
         .fillna(df.rename(columns={'Target': 'Source', 'Source': 'Target'}))
      )
df2 = pd.DataFrame(columns=pd.MultiIndex.from_frame(tmp))

解决方案

原代码的mask+fillna逻辑无法正确处理行反转,会导致生成无效的重复或空值行,最终无法得到正确的多列索引。以下是修正后的实现:

import pandas as pd

# 初始化数据
data = {'Source': ['Rainfall', 'SP2', 'SP2', 'Inflow','Rainfall','Inflow', 'Inflow', 'Inflow','SWT','SP1','SP1','SWD'],
        'Target': ['SP1', 'Evp', 'Outflow', 'SP2','SWD','SWD', 'SP2','SP1','SP1','SP2','Evp','Loss']}  
df = pd.DataFrame(data)

vals = ['SP1', 'SWD', 'SP2']

# 1. 筛选需要反转Source和Target的行
mask = df['Target'].isin(vals)
reversed_rows = df[mask].rename(columns={'Source': 'Target', 'Target': 'Source'})

# 2. 合并原行(无需反转)和反转后的行
tmp = pd.concat([df[~mask], reversed_rows]).reset_index(drop=True)

# 3. 去重,避免生成重复的多列索引
tmp_unique = tmp.drop_duplicates()

# 4. 创建带多列索引的空DataFrame
df2 = pd.DataFrame(columns=pd.MultiIndex.from_frame(tmp_unique))

逻辑说明

  • 用mask精准筛选出Target属于vals的行,对这些行互换Source和Target列
  • 合并无需反转的原始行与反转后的行,得到完整的映射关系
  • 去重操作消除重复的Source-Target对,避免多列索引出现重复列
  • 最终用去重后的映射关系生成多列索引,创建符合要求的空DataFramedf2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 02:12:15