如何重塑指定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
相关产品推荐
相关产品推荐

