求助:如何将指定Pandas DataFrame从窄格式重塑为宽格式?
Pandas DataFrame 重塑问题
我有如下所示的Pandas DataFrame(df):
请问能否将其重塑为如下所示的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
相关产品推荐
相关产品推荐

