我有一个类似于这样结构的pandas DataFrame:
我想把列
到目前为止,我已经做了这个:
然而,我相当确信有一种更简单的方法来实现这一点,而不需要复制虚拟变量和类似的解决方法。
您有什么想法吗?
df = pd.DataFrame( [
[ 'foo1', 'a', 'z', 'bar1', 1, 4 ],
[ 'foo2', 'b', 'y', 'bar2', 2, 5 ],
[ 'foo3', 'c', 'x', 'bar3', 3, 6 ]
] )
df.columns = [ 'foo', 'let1', 'let2', 'bar', 'num1', 'num2' ]
print( df )
foo let1 let2 bar num1 num2
0 foo1 a z bar1 1 4
1 foo2 b y bar2 2 5
2 foo3 c x bar3 3 6
我想把列
let1
和let2
堆叠起来,并添加一个标签,说明它们来自哪里。对于num1
和num2
也是同样的操作。最终,我希望实现这个效果: foo let letval bar num numval
0 foo1 let1 a bar1 num1 1
1 foo2 let1 b bar2 num1 2
2 foo3 let1 c bar3 num1 3
3 foo1 let2 z bar1 num2 4
4 foo2 let2 y bar2 num2 5
5 foo3 let2 x bar3 num2 6
到目前为止,我已经做了这个:
let = pd.concat( [ df.let1, df.let2 ] )
num = pd.concat( [ df.num1, df.num2 ] )
df = df.drop( ['let1', 'let2', 'num1', 'num2' ], axis=1 )
df = pd.concat( [ df, df ] )
df[ 'letval' ] = let
df[ 'numval' ] = num
print( df )
foo bar letval numval
0 foo1 bar1 a 1
1 foo2 bar2 b 2
2 foo3 bar3 c 3
0 foo1 bar1 z 4
1 foo2 bar2 y 5
2 foo3 bar3 x 6
然而,我相当确信有一种更简单的方法来实现这一点,而不需要复制虚拟变量和类似的解决方法。
您有什么想法吗?
pd.lreshape(df, {'letval': ['let1', 'let2'], 'numval': ['num1', 'num2']})
。这不是一个有良好文档的函数,因此将其作为注释添加。 - ayhanlreshape
,这绝对是一个值得关注的好方法。我也认为将其发布为部分答案是值得的 :) - Luis