pandas DataFrame如何合并重复列生成唯一列结构
实现pandas重复列合并为规整纵向结构的方法
目标结构说明
你当前的原始DataFrame为单行四列、列名重复(AB、XY、AB、XY),对应值为yyy、xxx、xrx、zzz,需要转换为两列(AB、XY)、两行分别对应同名列横向取值的规整结构:
| AB | XY |
|---|---|
| yyy | xxx |
| xrx | zzz |
可直接运行的实现代码
首先构造与你描述完全匹配的原始测试DataFrame:
import pandas as pd # 原始重复列DataFrame raw_df = pd.DataFrame( [["yyy", "xxx", "xrx", "zzz"]], columns=["AB", "XY", "AB", "XY"] )
方法1:同名列逐列提取拼接(逻辑最直观)
核心逻辑是提取每个唯一列名下的所有横向重复值,将其转为纵向序列,最终拼接为规整表:
# 拿到无重复的列名列表 unique_columns = raw_df.columns.unique() # 逐列提取重复值并转为纵向序列,拼接为新DataFrame result = pd.concat( [ raw_df[col].stack().reset_index(drop=True).rename(col) for col in unique_columns ], axis=1 )
方法2:转置后按列名分组处理(适合大规模数据)
核心逻辑是先转置把原来的列名转为行索引,再按列名分组拆分横向的重复列组,适配更大体量的重复列场景:
# 先将原表转置,原列名转为行索引 transposed_df = raw_df.T # 按列名分组,将同组的重复列值拆为独立行,再转置回目标结构 result = transposed_df.groupby(level=0).apply( lambda group: group.reset_index(drop=True).T ).droplevel(0).reset_index(drop=True)
效果验证
两种方法运行后得到的result均与目标结构完全一致:
AB XY 0 yyy xxx 1 xrx zzz
注意:如果不同列名的重复出现次数不一致,上述两种方法都会自动按最短重复次数对齐,缺失值自动填充为NaN,无需额外兼容处理
内容的提问来源于stack exchange,提问作者oyugi.collins
相关产品推荐
相关产品推荐

