如何用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再合并
- 对每个DataFrame进行列拆分+重塑,提取标识列
cValue - 合并处理后的长格式表并调整列名
# 处理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
相关产品推荐
相关产品推荐

