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

如何在Pandas中合并同名列?现有方法报错求解决方案

合并DataFrame同名列的正确方法

问题场景

你的DataFrame包含多组同名列(items_group、quantity各两列),数据分布为前几行对应左侧列、后几行对应右侧列,需要将同名的列合并为单一列。之前使用stack().dropna().unstack()的方法会抛出ValueError: Index contains duplicate entries, cannot reshape错误。

报错原因

stack()会将列索引转换为多层索引的一部分,当原DataFrame的行索引在stack后,出现同一行索引+目标列名的重复组合时,unstack()无法确定唯一的映射关系,因此触发重复索引的报错。

解决方案

方案一:按列名直接分组合并

针对每个唯一列名,将所有同名列的非空值纵向拼接,生成新的Series,再组合成最终DataFrame。

示例代码:

import pandas as pd
import numpy as np

# 模拟你的DataFrame结构
df = pd.DataFrame({
    'items_group': ['A', 'B', np.nan, np.nan],
    'quantity': [10, 20, np.nan, np.nan],
    'items_group': [np.nan, np.nan, 'C', 'D'],
    'quantity': [np.nan, np.nan, 30, 40]
})

# 合并同名列
merged_df = pd.DataFrame({
    col: df[col].stack().reset_index(drop=True)
    for col in df.columns.unique()
})

print(merged_df)

输出结果:

items_group  quantity
0           A        10
1           B        20
2           C        30
3           D        40

方案二:使用melt+分组重排(适配更复杂场景)

如果你的DataFrame结构更复杂,可通过熔化为长格式后重新分组拼接:

# 添加临时行索引,避免熔解后索引混乱
df['temp_idx'] = df.index

# 熔化为长格式,过滤空值
melted = df.melt(id_vars='temp_idx', var_name='column', value_name='value').dropna()

# 按列名分组,重新生成连续索引后透视回宽格式
merged_df = melted.groupby('column')['value'].apply(lambda x: x.reset_index(drop=True)).unstack()

# 重置最终索引
merged_df = merged_df.reset_index(drop=True)

print(merged_df)

两种方案都能避免重复索引问题,确保同名列的非空值被正确合并到单一列中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 09:20:18