【随笔】Pandas三种实现数据透视表的方法
前言
主要想做的事情用大白话来讲就是: 一个dataframe里面对于两个列做分组,最后算一个value对应于这两个列的分组来算值的矩阵,这个矩阵的行为其中一个列,列也为其中一个列。
新建一个df
import pandas as pd
import numpy as np
v = [1, 2, 3, 3, 3]
a = pd.DataFrame({'v': v})
d = [2 , 4, 4, 5, 4]
a['d'] = d
c = ['c' , 'h', 'd', 'e', 'c']
a['c'] = c
df用两列进行分组grouby
a.groupby(['v', 'd'])['c'].count()
我的要干的事情 就是把这个v当作列index,d当作行columns,之后把对应的分组的’c‘.count()放到对应的索引loc处,不存在的值用0填补。
最后得到一个以v为index, d为column的df,也可以搞成对应的矩阵matrix
第一种方法:pd.crosstab
cpd = pd.crosstab(a['v'], a['d'], a['c'], aggfunc='count')
查看index和columns
我们再来一步就可以得到我们想要的了,把nan填充一下。
cpd = cpd.fillna(0)
转换为array和list的方法
cpd_arr1 = np.array(cpd)
cpd_arr2 = np.array(cpd.values.tolist())
cpd_arr3 = cpd.as_matrix()
cpd_list = cpd.values.tolist()
整体流程
cpd = pd.crosstab(a['v'], a['d'], a['c'], aggfunc='count')
cpd = cpd.fillna(0)
cpd_arr = np.array(cpd)
cpd_arr
总结一句话
np.array(pd.crosstab(a['v'], a['d'], a['c'], aggfunc='count').fillna(0))
第二种方法:pivot()
groupby的as_index=False
a.groupby(['v', 'd'], as_index=False)['c'].count()
把操作的三列的值恢复到df上,每一个列还是对应的列。
pivot
a.groupby(['v', 'd'], as_index=False)['c'].count().pivot('v', 'd', 'c')
对应关系如下:
整体流程
ppd = a.groupby(['v', 'd'], as_index=False)['c'].count().pivot('v', 'd', 'c')
ppd = ppd.fillna(0)
ppd_arr = np.array(ppd)
ppd_arr