您的位置: 网站首页> Pandas教程> 当前文章

pandas多列变多行(即宽表变长表)melt和stack函数

老董-我爱我家房产SEO2022-05-01197围观,100赞

  多行转多列和多列转多行是较为常见的操作,上一篇文章介绍了pandas多行变多列(即长表变宽表)操作,本文介绍pandas多列变多行(即宽表变长表)操作,分别用melt和stack来实现。

  1、利用melt函数实现多列变多行

DataFrame.melt(id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None, ignore_index=True)

  官方文档melt参数很多,但是我常用的也就4个。id_vars:代表选择作为行索引的列;value_vars:代表选择获取值的列;var_name:对value_vars重命名;value_name:对值所在的列重命名。空谈没感觉,用例子来展示。

# -*- coding:UTF-8 -*-
import pandas as pd   

df = pd.read_excel('11.xlsx')
print(df)
print('--------------')
df_res = df.melt(id_vars=['duankou'], value_vars=['bj','sh'])
print(df_res)
print('==============')
# 进行重命名
df_res = df.melt(id_vars=['duankou'], value_vars=['bj','sh'],var_name='city', value_name='num')
print(df_res)
  duankou    bj    sh    nj
0      pc  1000  1200  2000
1      mo  1500  1600  2500
--------------
  duankou variable  value
0      pc       bj   1000
1      mo       bj   1500
2      pc       sh   1200
3      mo       sh   1600
==============
  duankou city   num
0      pc   bj  1000
1      mo   bj  1500
2      pc   sh  1200
3      mo   sh  1600

  2、利用stack实现多列变多行

DataFrame.stack(level=- 1, dropna=True)

  对比melt函数可以发现,stack函数侧重于对索引层级的操作,如果是2重索引的df,则level=-1代表内层索引。我们拿双重索引的df来演示下。

# -*- coding:UTF-8 -*-
import pandas as pd   

import pandas as pd   

df = pd.read_excel('11.xlsx',index_col=[0],header=[0,1])
print(df)
df_res = df.stack(level=-1)
print(df_res)
           bj          sh          nj      
duankou   low  high   low  high   low  high
pc       1000  1100  2000  2100  3000  3100
mo       1500  1600  2500  2600  3500  3600
              bj    nj    sh
   duankou                  
pc high     1100  3100  2100
   low      1000  3000  2000
mo high     1600  3600  2600
   low      1500  3500  2500

  关于pandas多列变多行(即宽表变长表)的操作就介绍到这里,读者可以结合上一篇长表变宽表来集中学习理解。

很赞哦!

python编程网提示:转载请注明来源www.python66.com。
有宝贵意见可添加站长微信(底部),获取技术资料请到公众号(底部)。同行交流请加群 python学习会

文章评论

    pandas多列变多行(即宽表变长表)melt和stack函数文章写得不错,值得赞赏

站点信息

  • 网站程序:Laravel
  • 客服微信:a772483200