如何将含a1/p1、a2/p2等配对列的DataFrame堆叠得到仅含a、p两列的新表
实现方案
你可以通过pandas的内置函数或者手动拼接的方式完成需求,以下是可直接运行的代码示例:
方法1:使用pd.wide_to_long(推荐,代码更简洁高效)
适用于列名规范的场景,不需要手动遍历列:
import pandas as pd # 构造示例数据,你可以替换为自己的DataFrame df = pd.DataFrame({ 'a1': [1,7], 'p1': [2,8], 'a2': [3,9], 'p2': [4,10], 'a3': [5,11], 'p3': [6,12] }) # 宽表转长表 result = pd.wide_to_long( df, stubnames=['a', 'p'], # 列的公共前缀 i=df.index, # 原始行的索引作为唯一标识 j='group_id' # 存储原始列的后缀数字,不需要可后续删除 ).reset_index(drop=True)[['a', 'p']] print(result)
方法2:手动遍历配对列拼接
逻辑更直观,适合需要自定义配对规则的场景:
import pandas as pd # 构造示例数据,你可以替换为自己的DataFrame df = pd.DataFrame({ 'a1': [1,7], 'p1': [2,8], 'a2': [3,9], 'p2': [4,10], 'a3': [5,11], 'p3': [6,12] }) pair_dfs = [] # 计算总共有多少组a/p配对 group_count = len(df.columns) // 2 for idx in range(1, group_count + 1): # 提取对应组的a、p列,重命名后加入待拼接列表 temp_df = df[[f'a{idx}', f'p{idx}']].rename(columns={ f'a{idx}': 'a', f'p{idx}': 'p' }) pair_dfs.append(temp_df) # 纵向拼接所有分组 result = pd.concat(pair_dfs, ignore_index=True) print(result)
两种方法输出的结果均符合你的预期:
| a | p |
|---|---|
| 1 | 2 |
| 7 | 8 |
| 3 | 4 |
| 9 | 10 |
| 5 | 6 |
| 11 | 12 |
内容的提问来源于stack exchange,提问作者Budding_Data_Analyst
相关产品推荐
相关产品推荐

