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

如何将含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)

两种方法输出的结果均符合你的预期:

ap
12
78
34
910
56
1112

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:45:01