实践中,很多数据是一维的,比如按客户编号构建的一张分地区、分阶段违约次数表。一维数组:
现在需要将其转换为二维矩阵,各地区、各阶段的客户违约次数之和。既做了一维转二维的工作,也做了分类汇总的工作。二维数组:
这类的业务需求很多,在实践中经常需要。在EXCEL中,是通过数据透视功能实现的。那么在大数据处理过程中,通过PYTHON怎么实现?PYTHON有一个专门的命令,pivot_table。今天就介绍pivot_table,重点说明怎么处理复合表头问题。
先创建数据:
#创建数据
import pandas as pd
import numpy as np
df = pd.DataFrame({'客户编号': ['001','002', '003','004','005', '006','007','008', '009','010','011', '012'],
'所在地区': ['福州','福州', '福州','福州','福州', '福州','泉州','泉州','泉州', '厦门', '厦门', '厦门'],
'所处阶段': ['阶段一', '阶段二', '阶段三','阶段二', '阶段三','阶段一', '阶段一','阶段二', '阶段三' ,'阶段一','阶段二','阶段三'],
'违约次数':[2,6,11,6,12,3,4,3,2,9,5,6]
})
df
以’所在地区’为行,即index;以所处阶段为列,即columns。以’违约次数’为表格数据,即values。数据加工方式求和,即sum。
#pivot_table
df_1=pd.pivot_table(df,index=['所在地区'],columns='所处阶段',values=['违约次数' ],aggfunc=np.sum)
df_1
结果是这样的:
其结果是两层标题表,复合表头,是无法后续加工处理的,如筛选等。
代码如下:
df_1=pd.pivot_table(df,index=['所在地区'],columns='所处阶段',values=['违约次数' ],aggfunc=np.sum)
df_1.reset_index(inplace=True)
df_1
结果是这样的:
其结果仍然是两层标题表,复合表头,是无法后续加工处理的,如筛选等。
两层标题表,本质上我们没有告诉程序,究竟要以什么作为标题;或者说,从列表的角度,本来就应该是两层标题,一级标题是“所处阶段”,二级标题是“阶段一”、“阶段二”、“阶段三”。只是我们希望删除一级标题,只要二级标题,从而便于后续处理。那我们就得告诉程序,用“阶段一”、“阶段二”、“阶段三”作为标题,使用list(unique)命令组合。
代码如下:
df_1=pd.pivot_table(df,index=['所在地区'],columns='所处阶段',values=['违约次数' ],aggfunc=np.sum)
val=list(df['所处阶段'].unique())
df_1.columns=pd.Series(val)
df_1.reset_index(inplace=True)
df_1
似乎是我们需要的。但要告诉大家的是,结果是错误的,厦门的阶段三应该是6,而不是5。为什么?
为什么上面的方式三是错误的,是因为代码并不是按照“阶段一”、“阶段二”、“阶段三”排列、排序的。那就统一排序吧,使用sorted(list(unique))命令组合。
代码如下:
df_1=pd.pivot_table(df,index=['所在地区'],columns='所处阶段',values=['违约次数' ],aggfunc=np.sum)
val=sorted(list(df['所处阶段'].unique()))
df_1.columns=pd.Series(val)
df_1.reset_index(inplace=True)
df_1