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

如何重塑指定Pandas DataFrame并新增in/out列生成6行数据

搞定DataFrame重塑:转成6行结构的方案

嘿,我来帮你实现这个DataFrame的重塑需求!根据你说的要转成6行,保留a、b列并新增in/out标识,我给你精准匹配需求的方案,同时也补充另一种常见的拆分场景供你参考:

方案一:每行原始数据拆成2行(输入组/输出组)

这个方案把每行里的cin+din作为输入组,cout+dout作为输出组,每组占一行,刚好3行原始数据转成6行结果,完全匹配你的要求。

步骤1:创建原始DataFrame

先把你提供的代码跑起来生成初始数据:

import pandas as pd

columns = ['a', 'b','cin','cout', 'din', 'dout']
rows = [[1 , 1, 3, 4, 2, 3], [2,3,3,1, 8 , 4], [3,1,3,1, 2, 1]]
dff1 = pd.DataFrame(rows, columns=columns)

步骤2:构造输入和输出行

我们分别提取输入列和输出列,把它们打包成列表后和a、b列组合:

# 生成输入组行:标记为in,值是cin和din的组合列表
input_rows = dff1[['a', 'b']].assign(
    **{'in/out': 'in', 'values': dff1[['cin', 'din']].values.tolist()}
)

# 生成输出组行:标记为out,值是cout和dout的组合列表
output_rows = dff1[['a', 'b']].assign(
    **{'in/out': 'out', 'values': dff1[['cout', 'dout']].values.tolist()}
)

# 合并两组数据并排序,让结果更规整
final_df = pd.concat([input_rows, output_rows], ignore_index=True)
final_df = final_df.sort_values(by=['a', 'b', 'in/out']).reset_index(drop=True)

最终6行结果

运行后final_df的结构如下:

a  b in/out  values
0  1  1     in  [3, 2]
1  1  1    out  [4, 3]
2  2  3     in  [3, 8]
3  2  3    out  [1, 4]
4  3  1     in  [3, 2]
5  3  1    out  [1, 1]

方案二:每个输入输出值单独成行(12行)

如果你其实是想把cin、cout、din、dout每个数值都拆成独立行(可能你说的6行是笔误?),可以用melt函数快速实现:

# 把宽表转成窄表,每个字段值单独成行
final_df = dff1.melt(
    id_vars=['a', 'b'],
    value_vars=['cin', 'cout', 'din', 'dout'],
    var_name='temp_type',
    value_name='value'
)

# 从临时类型列中提取in/out标识
final_df['in/out'] = final_df['temp_type'].str.extract('(in|out)')

# 清理临时列并排序
final_df = final_df.drop('temp_type', axis=1).sort_values(by=['a', 'b', 'in/out']).reset_index(drop=True)

这个方案会生成12行数据,每个原始字段的数值都单独占一行,in/out列清晰标识是输入还是输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:54:37