
本文介绍如何在pandas中处理因重命名导致的重复列名问题,并将同名列中非空值聚合为列表,避免数据丢失,同时保持行级结构一致性。
本文介绍如何在pandas中处理因重命名导致的重复列名问题,并将同名列中非空值聚合为列表,避免数据丢失,同时保持行级结构一致性。
当使用 df.rename() 将多个原始列映射到相同列名(如 "a_1", "a_2", "a_3" → "a")时,Pandas 会生成具有重复列名的 DataFrame。此时直接访问 df2['a'] 返回的是一个包含多列的 DataFrame(而非 Series),无法直接调用 .apply() 进行逐行操作——这正是原尝试中报错 TypeError:
正确解法是利用列名索引层级特性:先转置(.T),使原列名变为行索引;再按索引级别(level=0)分组,对每组(即每个逻辑列名,如 'a', 'b', 'c')应用自定义聚合函数;最后再次转置恢复原始行列方向。
result = df2.T.groupby(level=0).agg(lambda x: x[x != ''].tolist()).T
该语句执行逻辑如下:
- df2.T:将列变行,重复列名成为行索引(如 'a' 出现三次,对应三行);
- .groupby(level=0):按第一级行索引(即列名)分组;
- .agg(...):对每组(即每个同名列的所有列数据)执行聚合:筛选非空字符串(x != ''),转为 Python 列表;
- .T:还原为常规 DataFrame,列名为 'a', 'b', 'c',每行为对应列表。
✅ 输出结果严格匹配预期:
a b c 0 [x] [] [z] 1 [x, y] [] [z]
⚠️ 注意事项:
- 此方法依赖 ''(空字符串)作为“无效值”标识;若数据含 None, np.nan 或其他占位符,需调整条件,例如 x.dropna().tolist() 或 x.replace('', pd.NA).dropna().tolist();
- 若原始数据含数字、布尔值等类型,建议统一预处理为空值检测逻辑(如 x.notna());
- groupby.agg 在空组时默认返回 [],无需额外处理,符合需求;
- 避免使用 pd.concat(..., axis=1) 或循环 df2[c] = ... 等易出错方式——重复列名会使赋值行为不可靠。
此方案简洁、向量化、健壮,是处理“列名折叠+值聚合”场景的标准实践。











