鉴于一直以来,总有人在群里面或者私下问,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
结果如下:
今天的内容大致就到这里,你学会了吗?如果还是有点模糊,可能还是函数参数太多导致的,大家下去仔细研究一下函数,即可!
配套视频演示
返回搜狐,查看更多
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。