
本文介绍使用 pandas 的 melt() 方法将多个同类型来源列(如 source1site、source2site、source3site)高效合并为单列 mergesourcesite,同时完整保留 companyname、city 等关联字段,并自动去重、清洗空值、重排索引。
本文介绍使用 pandas 的 melt() 方法将多个同类型来源列(如 source1site、source2site、source3site)高效合并为单列 mergesourcesite,同时完整保留 companyname、city 等关联字段,并自动去重、清洗空值、重排索引。
在数据整合场景中,常需将来自不同渠道但语义相同的多列(如多个网站域名字段)“堆叠”为单一列,同时确保原始记录的上下文(如公司名、城市)不丢失。直接使用 concat 或 apply 易导致索引错位或冗余行;而 pd.melt() 是专为此类宽表→长表转换设计的稳健方案。
以下为完整实现步骤(基于 pandas 2.0+):
import pandas as pd
import numpy as np
# 示例数据(注意:原问题中 'Nan' 应为 Python 的 np.nan)
df = pd.DataFrame({
"index": [1, 2, 3, 4, 5, 6, 7],
"CompanyName": ["Comp1", "Comp1", "Comp2", "Comp2", "Comp3", "Comp4", "Comp5"],
"Source1site": ["web1.com", "Web2.com", np.nan, "site2.com", np.nan, np.nan, np.nan],
"Source2site": [np.nan, "web2.com", "site1.com", np.nan, np.nan, "url1.com", "example.com"],
"Source3site": ["web2.com", np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
"City": ["Paris", np.nan, "Oakland", "London", "Mexico", np.nan, "New York"]
})
# 步骤1:melt 合并来源列 → 将三列“折叠”为长格式
merged = df.melt(
id_vars=["index", "CompanyName", "City"], # 保持不变的标识列
value_vars=["Source1site", "Source2site", "Source3site"], # 待合并的源列
var_name="source_origin", # 新增列名,记录原列来源(可选,后续丢弃)
value_name="MergeSourceSite" # 合并后目标列名
)
# 步骤2:过滤空值,仅保留有效域名
merged = merged.dropna(subset=["MergeSourceSite"]).copy()
# 步骤3:去重(避免同一 index+CompanyName+City+域名重复出现)
# 注意:此处去重基于全部字段组合,确保逻辑一致性
merged = merged.drop(columns="source_origin").drop_duplicates().reset_index(drop=True)
# 步骤4:按原始 index 排序,提升可读性(非必需,但符合示例输出顺序)
merged = merged.sort_values(by="index").reset_index(drop=True)✅ 关键说明与注意事项:
-
melt()不会破坏原始行间关系,id_vars中的列(如index,CompanyName,City)将被广播到每一行新记录中; -
dropna(subset=[...])严格过滤目标列为空的行,避免引入无效数据; -
drop_duplicates()防止因多列同时含相同值而导致重复行(例如某公司两列都填了web2.com); - 若需保留来源列信息(如标记数据来自 Source2site),可保留
source_origin列并用于后续溯源分析; - 字符串大小写敏感:
"Web2.com"与"web2.com"被视为不同值;如需统一规范,可在dropna后添加.str.lower()处理。
最终输出结构清晰、语义明确,完美匹配需求——每条有效域名记录均关联其所属公司与城市,为后续去重、匹配或可视化奠定坚实基础。

















