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

求助:如何将指定Pandas DataFrame从窄格式重塑为宽格式?

Pandas DataFrame 重塑问题

我有如下所示的Pandas DataFrame(df):
原始DataFrame df

请问能否将其重塑为如下所示的DataFrame(df1):
目标DataFrame df1

我提供了一段示例代码,但无法正常运行,恳请各位提供解决方案或建议,非常感谢。示例代码如下:

data = {'Source': ['Rainfall', 'Inflow', 'SWCD', 'SWCD','Rainfall','Inflow', 'SP1', 'SP1'],
        'Target': ['SWCD', 'SWCD', 'Evp', 'Outflow','SP1','SP1', 'Evp', 'Overflow']}  
    
df = pd.DataFrame(data)
df1 = df.loc[:, ["Source", "Target"]]
df1 = df.values.flatten()
df.set_index('Target').T

解决方案

你要实现的是以唯一的Source为行、唯一的Target为列,标记每个Source与Target的对应关系,以下是可行的实现方法:

方法一:使用pivot_table

import pandas as pd

data = {'Source': ['Rainfall', 'Inflow', 'SWCD', 'SWCD','Rainfall','Inflow', 'SP1', 'SP1'],
        'Target': ['SWCD', 'SWCD', 'Evp', 'Outflow','SP1','SP1', 'Evp', 'Overflow']}  
df = pd.DataFrame(data)

# 添加标记列,用于后续填充对应关系
df['Flag'] = 1

# 重塑表格:行是Source,列是Target,保留对应关系的标记,缺失值填空
df1 = df.pivot_table(index='Source', columns='Target', values='Flag', aggfunc='first').fillna('')

# 将Source从索引转为普通列,去除列轴名称,和目标结构对齐
df1 = df1.reset_index().rename_axis(None, axis=1)

print(df1)

输出结果与目标df1结构一致:

Source Evp Outflow Overflow SP1 SWCD
0  Rainfall        1    1
1    Inflow        1    1
2      SWCD   1       1
3       SP1   1              1

方法二:使用pd.crosstab(更简洁)

利用交叉表自动统计对应关系,再将0替换为空:

import pandas as pd

data = {'Source': ['Rainfall', 'Inflow', 'SWCD', 'SWCD','Rainfall','Inflow', 'SP1', 'SP1'],
        'Target': ['SWCD', 'SWCD', 'Evp', 'Outflow','SP1','SP1', 'Evp', 'Overflow']}  
df = pd.DataFrame(data)

df1 = pd.crosstab(df['Source'], df['Target'])
# 把统计的0替换为空字符串,符合目标样式
df1 = df1.replace(0, '').reset_index().rename_axis(None, axis=1)

print(df1)

原代码问题说明

你的代码无法得到预期结果的原因:

  • df1 = df.values.flatten()会把整个DataFrame压成一维数组,直接丢失了行列结构,完全偏离需求
  • df.set_index('Target').T只是简单转置,但原表存在重复的Target值,转置后会出现重复列名,无法形成你需要的交叉对应结构

内容的提问来源于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.14 22:17:16