超经典的Pandas “行列” 转换教程!

科技
4阅读

点击上图,查看教学大纲

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

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

列转行

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

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

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

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

df

结果如下:

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

① stack方法

df1 = df.stack.reset_index

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

df1

结果如下:

② melt方法

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

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

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

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

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

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)

df2

结果如下:

行专列

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

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

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

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

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

df

结果如下:

在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:相当于修改"总计"名,为其它名称;

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

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

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

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

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

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

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

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

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

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

df1

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

df1.columns.name = None

df1.index.name = None

df1

结果如下:

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

配套视频演示

the end
免责声明:本文不代表本站的观点和立场,如有侵权请联系本站删除!本站仅提供信息存储空间服务。

精选推荐

随机推荐