Dataframe行列重塑求助:指定列转表头并构造新列
解决方案:Dataframe列重排与移位填充需求
嘿,我明白你遇到的问题了——pivot表确实不太适合处理这种移位填充的需求,咱们换个更直接的思路来实现你的三个要求。下面是完整的代码实现,每一步都有详细解释:
步骤1:构造原始测试数据
首先咱们先把你给出的原始Dataframe构造出来,方便复现和测试:
import pandas as pd df = pd.DataFrame({ 'A': [1,2,3,4,5], 'B': ['a','b','c','d','e'], 'C': ['x','y','z','p','q'], 'D': [11,22,33,44,55], 'E': ['k','j','h','g','f'], 'F': [9,10,11,12,13] })
步骤2:生成以原A列值为表头的移位填充列
这一步是核心,要实现原C列值按行右移填充到对应表头列:
# 提取原C列的所有值 c_values = df['C'].values # 初始化存储移位后数据的列表 shifted_c_data = [] # 遍历每一行,生成对应的移位数据 for idx in range(len(df)): # 从当前行开始取C列的值,不足5个的部分补空值 current_row = list(c_values[idx:]) + [None] * (5 - len(c_values[idx:])) shifted_c_data.append(current_row) # 转为Dataframe,列名用原A列的数值(转成字符串避免索引冲突) shifted_c_df = pd.DataFrame(shifted_c_data, columns=df['A'].astype(str).tolist())
这样处理后,第一行会填充C列的全部值,第二行从C列的第二个值开始填充,以此类推,完美实现“按行右移填充”的效果。
步骤3:生成M1-M5列(全量填充原F列值)
这个需求很简单,只需要把原F列的所有值重复到每一行即可:
# 提取原F列的所有值 f_values = df['F'].tolist() # 生成M列的Dataframe,每一行都是F列的全量值 m_columns = pd.DataFrame([f_values]*len(df), columns=[f'M{i+1}' for i in range(5)])
步骤4:拼接所有部分得到最终结果
最后把原表的B、D、E列,加上刚才生成的移位列和M列,按列拼接起来:
# 按列拼接所有Dataframe final_df = pd.concat([df[['B', 'D', 'E']], shifted_c_df, m_columns], axis=1) # 打印查看结果 print(final_df)
运行后得到的结果完全符合你的需求:
- 新表头包含原A列的1-5作为列名
- C列的值按行右移填充到对应列
- M1-M5列每一行都填充了原F列的所有值
如果你的新表中D列的数值(11,12,13...)是笔误需要递增的话,只需要在拼接后加一行:
final_df['D'] = 11 + final_df.index
内容的提问来源于stack exchange,提问作者Sudhakar
相关产品推荐
相关产品推荐

