鉴于一直以来,总有人在群里面或者私下问,Python行转列、列转行的问题。 基于此,我这里写一篇较全的文章,分享给大家。

为了给大家更加细致的讲述本文,我这里给大家造一些详细的数据。本文看完即学会,黄同学保证的。

首先我们看一下“列转行”的问题。这里我们利用pandas构造了这样一份数据。

df = pd.DataFrame({ "语文" :[ 2 , 4 ],

"数学" :[ 6 , 8 ]})

df.index = [ "张三" , "李四" ]

结果如下:

从表中可以看到:语文、数学都在列上面,我们如何将这些列转为行呢?这里有两种方式:

① stack方法

df1 = df.stack.reset_index

df1.columns = [ "姓名" , "科目" , "成绩" ]

结果如下:

② melt方法

由于这个函数参数多一些,我这里给大家先讲一下语法。

  • id_vars:列转行,不变的那一列;

  • value_vars:列转行,需要变动的那些列的列名;

  • var_name:列转为行后,新表的列名;

  • value_name:列转为行后,新表的值那一列的列明;

  • 首先,我们再看看原来的数据长啥样。

    接着,我们进行reset_index操作后,再看看数据长啥样。

    我们就是要利用这个数据,完成最终的操作。

    df2 = df2.melt(id_vars= 'index' ,value_vars=[ '语文' , '数学' ],var_name= "科目" ,value_name= "成绩" )

    df2.rename(columns={ "index" : "姓名" },inplace= True )

    结果如下:

    “行专列”这个需求,大家应该都见过。因为我们只要是用过数据透视表的同学,应该都知道这个需求。

    我们在为大家构造一份数据,接着看。

    df = pd.DataFrame({ "姓名" :[ "张三" , "李四" , "张三" , "李四" ],

    "科目" :[ "语文" , "语文" , "数学" , "数学" ],

    "成绩" :[ 2 , 4 , 6 , 8 ]})

    结果如下:

    在pandas中,我们使用pivot_table函数,来完成“行转列”的需求。在写代码之前,我先为大家讲解一下这个函数。

    pd.pivot_table(data,index= None ,columns= None ,

    values= None ,aggfunc= 'mean' ,

    margins= False ,margins_name= 'All' ,

    dropna= True ,fill_value= None )

  • data:相当于Excel中的"选中数据源";

  • index:相当于上述"数据透视表字段"中的行;

  • columns:相当于上述"数据透视表字段"中的列;

  • values:相当于上述"数据透视表字段"中的值;

  • aggfunc:相当于上述"结果"中的计算类型;

  • margins:相当于上述"结果"中的总计;

  • margins_name:相当于修改"总计"名,为其它名称;

  • 对应到Excel中,大致如下图:

    知道基础后,那么如何完成本文的需求呢?

    df1 = pd.pivot_table(df,index = '姓名' ,columns= '科目' ,values= '成绩' )

    # ------------------------------

    df1.columns.name = None

    df1.index.name = None

    结果如下:

    今天的内容大致就到这里,你学会了吗?如果还是有点模糊,可能还是函数参数太多导致的,大家下去仔细研究一下函数,即可!

    配套视频演示 返回搜狐,查看更多

    责任编辑:

    声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。