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

如何用Python将多个宽格式DataFrame转为单个长格式DataFrame

合并多个宽格式DataFrame为单个长格式(含NaN处理)

需求说明

现有两个独立的宽格式DataFrame(df1、df2),列名包含后缀标识(_A、_B),需要将它们转换为单个长格式DataFrame,保留原数据中的NaN值,新增cValue列区分原表的标识(A/B),同时将原列名前缀(c2、c3)转为独立的数值列。

示例数据

import pandas as pd
import numpy as np

df1 = pd.DataFrame({
    "id": ["Mark", "Dave", "Ron"], 
    "c2_A": [2, 3, np.nan], 
    "c3_A": [1, np.nan, np.nan]
})

df2 = pd.DataFrame({
    "id": ["Mark", "Dave", "Ron"], 
    "c2_B": [1, 0, np.nan], 
    "c3_B": [1, np.nan, 4]
})

解决方案

这里提供两种简洁的实现方式:

方法1:分别处理单个DataFrame再合并

  1. 对每个DataFrame进行列拆分+重塑,提取标识列cValue
  2. 合并处理后的长格式表并调整列名
# 处理df1,提取cValue为"A"
df1_long = df1.melt(id_vars="id", var_name="col", value_name="value")
df1_long[["metric", "cValue"]] = df1_long["col"].str.split("_", expand=True)
df1_long = df1_long.pivot(index=["id", "cValue"], columns="metric", values="value").reset_index()
df1_long.columns.name = None

# 处理df2,提取cValue为"B"
df2_long = df2.melt(id_vars="id", var_name="col", value_name="value")
df2_long[["metric", "cValue"]] = df2_long["col"].str.split("_", expand=True)
df2_long = df2_long.pivot(index=["id", "cValue"], columns="metric", values="value").reset_index()
df2_long.columns.name = None

# 合并并调整列名
dffinal = pd.concat([df1_long, df2_long], ignore_index=True)
dffinal = dffinal.rename(columns={"c2": "c2Value", "c3": "c3Value"})
# 按id排序匹配示例顺序
dffinal = dffinal.sort_values("id").reset_index(drop=True)

方法2:先合并宽表再统一重塑

如果DataFrame数量较多,先合并宽表再一次性处理更高效:

# 按id合并两个宽表
merged_wide = pd.merge(df1, df2, on="id")

# 重塑为长格式并拆分列名
dffinal = merged_wide.melt(id_vars="id", var_name="col", value_name="value")
dffinal[["metric", "cValue"]] = dffinal["col"].str.split("_", expand=True)

# 重新调整为目标结构
dffinal = dffinal.pivot(index=["id", "cValue"], columns="metric", values="value").reset_index()
dffinal.columns = ["id", "cValue", "c2Value", "c3Value"]
dffinal = dffinal.sort_values("id").reset_index(drop=True)

最终结果

运行上述代码后,dffinal将与期望的长格式DataFrame完全一致:

print(dffinal)
#        id cValue  c2Value  c3Value
# 0    Dave      A      3.0      NaN
# 1    Dave      B      0.0      NaN
# 2    Mark      A      2.0      1.0
# 3    Mark      B      1.0      1.0
# 4     Ron      A      NaN      NaN
# 5     Ron      B      NaN      4.0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:50:19