如何用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对,避免多列索引出现重复列 - 最终用去重后的映射关系生成多列索引,创建符合要求的空DataFrame
df2
内容的提问来源于stack exchange,提问作者Ponlok Peter
相关产品推荐
相关产品推荐

