如何在Pandas中将拼接列名拆分为独立列?
解决Pandas中拆分拼接列名并转换长表的问题
我来帮你搞定这个列拆分+宽转长的需求!这种把用|拼接的复合列名拆分成独立字段的场景在数据分析里很常见,咱们用Pandas几步就能实现目标结构:
步骤1:模拟/读取原始数据
先构造和你数据结构一致的测试样例(如果是读取本地文件,用pd.read_csv()等方法即可):
import pandas as pd # 模拟你的原始宽表数据 raw_data = { "Date": ["2018-11"], "Product1|CBA|MKD": [12], "Product1|CPA|MKD": [23], "Product1|CBA|IHR": [0], "Product2|CBA|IHR": [2] } df = pd.DataFrame(raw_data)
步骤2:将宽表转为长表
用melt()方法把所有复合列名的列转成"列名-数值"的键值对,保留Date作为分组标识:
# 宽转长,生成包含复合列名和对应数量的临时表 melted_df = df.melt( id_vars="Date", # 保留不参与转换的列 var_name="Combined", # 复合列名的新列名 value_name="Quantity" # 数量值的新列名 )
这一步之后,melted_df的结构会变成:
| Date | Combined | Quantity |
|---|---|---|
| 2018-11 | Product1 | CBA |
| 2018-11 | Product1 | CPA |
| ... | ... | ... |
步骤3:拆分复合列名为独立字段
对Combined列用str.split()拆分,并指定expand=True直接生成多列,然后给新列命名:
# 拆分复合列名,生成Product/Partner/Market三列 split_cols = melted_df["Combined"].str.split("|", expand=True) split_cols.columns = ["Product", "Partner", "Market"] # 把拆分后的列和原长表合并 final_df = pd.concat([melted_df[["Date", "Quantity"]], split_cols], axis=1)
步骤4:调整列顺序到目标结构
最后把列调整成你需要的顺序即可:
# 重新排列列 final_df = final_df[["Date", "Product", "Partner", "Market", "Quantity"]]
最终输出的final_df就是你想要的结构:
| Date | Product | Partner | Market | Quantity |
|---|---|---|---|---|
| 2018-11 | Product1 | CBA | MKD | 12 |
| 2018-11 | Product1 | CPA | MKD | 23 |
| 2018-11 | Product1 | CBA | IHR | 0 |
| 2018-11 | Product2 | CBA | IHR | 2 |
补充说明
- 如果你的原始数据中
Date是行索引,可以先通过df.reset_index()把索引转成列,再执行上述步骤。 - 这个方法完全适配"大量唯一列组合"的场景,
melt()会自动遍历所有复合列名,不会遗漏任何组合。
内容的提问来源于stack exchange,提问作者Zophai
相关产品推荐
相关产品推荐

