
本文介绍使用 pandas 的 melt() 方法将多个同类型来源列(如网站域名)展开为单列,同时保留原始索引、公司名和城市等关联字段,并自动过滤空值、去重、排序,生成结构清晰的扁平化数据表。
本文介绍使用 pandas 的 melt() 方法将多个同类型来源列(如网站域名)展开为单列,同时保留原始索引、公司名和城市等关联字段,并自动过滤空值、去重、排序,生成结构清晰的扁平化数据表。
在数据整合场景中,常需将来自不同渠道但语义相同的多列(如 Source1site、Source2site、Source3site)合并为一个统一的字段(如 MergeSourceSite),同时确保每条记录仍能准确关联其所属公司(CompanyName)和地理位置(City)。直接使用 fillna() 或 combine_first() 仅能横向“取首个非空值”,无法实现“一变多”的行扩展——而这正是 pandas.melt() 的核心优势。
以下为完整、健壮的实现方案:
import pandas as pd
import numpy as np
# 假设原始 DataFrame 已加载为 df
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 展开来源列 → 将三列“宽”变“长”
melted = df.melt(
id_vars=['index', 'CompanyName', 'City'], # 保持不变的关键标识列
value_vars=['Source1site', 'Source2site', 'Source3site'], # 待合并的源列
var_name='source_origin', # (可选)新增列记录原始列名,便于溯源调试
value_name='MergeSourceSite' # 合并后的新列名
)
# 步骤 2:剔除空值(NaN)记录
melted = melted.dropna(subset=['MergeSourceSite'])
# 步骤 3:去重(避免同一公司-城市-域名组合重复出现)
# 注意:此处去重基于全部列(含 index/CompanyName/City/MergeSourceSite),确保逻辑一致性
melted = melted.drop(columns=['source_origin']).drop_duplicates().reset_index(drop=True)
# 步骤 4:按原始 index 排序,提升可读性与业务对齐度
melted = melted.sort_values(by='index').reset_index(drop=True)
print(melted[['index', 'CompanyName', 'MergeSourceSite', 'City']])关键说明与注意事项:
- ✅
melt()是“行扩展”操作,能自然支持一对多映射(如 Comp2 在不同行对应site1.com和site2.com); - ⚠️
dropna()必须在melt()之后执行,否则会丢失有效组合; - ?
drop_duplicates()防止因数据录入冗余导致重复行(例如同一来源列中误填相同域名); - ? 域名大小写敏感:示例中
Web2.com与web2.com被视为不同值;若需标准化,可在dropna()后添加.str.lower()处理; - ? 若需保留原始列名信息用于审计,可保留
source_origin列,或用groupby('index').agg(list)实现聚合式汇总(非本例需求)。
最终输出严格匹配预期格式:每行代表一个有效的公司-域名-城市三元组,索引连续有序,无冗余、无缺失,可直接用于后续分析或导出。

















