加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 在DataFrame中堆叠两列,重复其他列

发布时间:2020-12-20 11:53:12 所属栏目:Python 来源:网络整理
导读:我有一个像这样的结构的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 ba
我有一个像这样的结构的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','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

但是,我很确定有一种更简单的方法可以实现这一点,而无需复制到虚拟变量和此类变通方法.

有任何想法吗?

解决方法

以下是我尝试将 @ayhan的解决方案与 pd.melt()方法相结合:

In [191]: (pd.melt(df.drop(['num1','num2'],1),id_vars=['foo','bar'],.....:          var_name='let',value_name='letval')
   .....:    .assign(numval=pd.lreshape(df.filter(like='num'),.....:                               {'numval': ['num1','num2']})))
Out[191]:
    foo   bar   let letval  numval
0  foo1  bar1  let1      a       1
1  foo2  bar2  let1      b       2
2  foo3  bar3  let1      c       3
3  foo1  bar1  let2      z       4
4  foo2  bar2  let2      y       5
5  foo3  bar3  let2      x       6

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读