本篇为python数据分析实战笔记的第五篇,主要内容是通过行列转换实现表格降维,以**“代码+注释+总结”**的形式进行展示。
任务目标:将一份列为时间,行为经营指标的表进行行列转换(数据库增加列难度比增加行难度要高)
原表:
经营指标 | 日期1 | 日期2 |
---|---|---|
指标1 | a | b |
指标2 | c | d |
指标3 | e | f |
预期结果:
经营指标 | 指标1 | 指标2 | 指标3 |
---|---|---|---|
时间1 | a | c | e |
时间2 | b | d | f |
主要内容:通过索引分组、stack()、unstack()实现行列转换
#读入数据并重命名列
df = pd.read_csv(doc,encoding="gbk")
df.rename(columns={"一级分类按服务类型":"产品类型","业务指标":"经营指标"},inplace=True)
#选取所需的数据
df[["经营指标","产品类型","产品一级分类","产品二级分类"]] = df[["经营指标","产品类型","产品一级分类","产品二级分类"]].astype(str)
df = df.loc[~df["经营指标"].str.contains("单|件数|体积|重量|市场费用|管理费用|研发费用")]
#通过对列进行切片实现分割时间项和其他项
list = [column for column in df]
list9 = list[9:]
#从列索引9到最后为时间列`在这里插入代码片`
list8 = list[0:9]
#从索引0到8(不包含9)是其他项
#索引操作
df2 = df.set_index(list8)
#将前8列设置为索引,列上就只剩下时间列了
df2 = pd.DataFrame(df2,columns=pd.Index(list9,name="日期"))
#将时间列的标题名做成一个组,命名为“日期”
df3 = df2.stack().unstack(1).sort_index(by=["区域","日期","件型","产品类型","经分一级分类","经分二级分类"],ascending=[1,1,1,1,1,1]).reset_index()
#stack()可以将列变为行,unstcak(1)将序号为1的行索引变为列。由于变动之后索引顺序比较乱,需要重排索引
#.sort_values(by=[],ascending=[])可以实现对值的重新排序,by表示根据……进行排序,ascending为是否顺序排列。
df3 = df3[~df3["日期"].isin(["Q","H","FY"])]
#去掉不规整的日期类型,如季度/半年度/年度累计等
df3.to_excel("3.xlsx",encoding="gbk")
关于python索引操作详见《python数据分析:第八章》
部分索引操作如下:
查看索引:df.index
设置层次索引的例子:
data = pd.Series(np.random.randn(9),
……: index=[['a', 'a', 'a', 'b', 'b', 'c', 'c', 'd', 'd'],
……: [1, 2, 3, 1, 3, 1, 2, 2, 3]])
可以通过选取索引来选取数据: df["b":"c"]
同时选取行列索引:df.loc[:,2]
对行列索引命名:df.index.names = []; df.columns.names = []
可以通过索引进行统计:df.sum(level="color",axis=1行方向)
设置索引:df.set_index(["c","d"])