鉴于一直以来,总有人在群里面或者私下问,Python行转列、列转行的问题。基于此,我这里写一篇较全的文章,分享给大家。
列转行
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:列转为行后,新表的值那一列的列明;
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
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:相当于修改"总计"名,为其它名称;
df1 = pd.pivot_table(df,index ='姓名',columns='科目',values='成绩')
df1
# ------------------------------
df1.columns.name = None
df1.index.name = None
df1

