用Python实现数据的透视表的方法
在处理数据时,经常需要对数据分组计算均值或者计数,在MicrosoftExcel中,可以通过透视表轻易实现简单的分组运算。而对于更加复杂的分组运算,Python中pandas包可以帮助我们实现。
1数据
首先引入几个重要的包:
importpandasaspd importnumpyasnp frompandasimportDataFrame,Series
通过代码构造数据集:
data=DataFrame({'key1':['a','b','c','a','c','a','b','a','c','a','b','c'],'key2':['one','two','three','two','one','one','three','one','two','three','one','two'],'num1':np.random.rand(12),'num2':np.random.randn(12)})
得到数据集如下:
data key1key2num1num2 0aone0.2687050.084091 1btwo0.8767070.217794 2cthree0.2299990.574402 3atwo0.707990-1.444415 4cone0.7860640.343244 5aone0.5872731.212391 6bthree0.9273961.505372 7aone0.295271-0.497633 8ctwo0.2927210.098814 9athree0.369788-1.157426
2交叉表—分类计数
按照不同类进行计数统计是最常见透视功能,可以通
(1)crosstab
#函数: crosstab(index,columns,values=None,rownames=None,colnames=None,aggfunc=None,margins=False,dropna=True,normalize=False)
crosstab的index和columns是必须要指定复制的参数:
pd.crosstab(data.key1,data.key2)
结果如下:
key2onethreetwo key1 a311 b011 c111
想要在边框处增加汇总项可以指定margin的值为True:
pd.crosstab(data.key1,data.key2,margins=True)
结果:
key2onethreetwoAll key1 a3115 b1113 c1124 All53412
(2)pivot_table
函数:
pivot_table(data,values=None,index=None,columns=None,aggfunc='mean',fill_value=None,margins=False,dropna=True,margins_name='All')
使用pivot_table函数同样可以实现,运算函数默认值aggfunc='mean',指定为aggfunc='count'即可:
data.pivot_table('num1',index='key1',columns='key2',aggfunc='count')
结果相同:
key2onethreetwo key1 a311 b111 c112
(3)groupby
通过groupby相对来说会更加复杂,首先需要对data按照key1和key2进行聚类,然后进行count运算,再将key2的index重塑为columns:
data.groupby(['key1','key2'])['num1'].count().unstack()
结果:
key2onethreetwo key1 a311 b111 c112
3其它透视表运算
(1)pivot_table
pivot_table(data,values=None,index=None,columns=None,aggfunc='mean',fill_value=None,margins=False,dropna=True,margins_name='All')
要进行何种运算,只需要指定aggfunc即可。
默认计算均值:
data.pivot_table(index='key1',columns='key2')
out:
num1num2 key2onethreetwoonethreetwo key1 a0.1933320.7056570.203155-0.1657492.398164-1.293595 b0.1679470.2045450.6614600.555850-0.5225280.143530 c0.4969930.0336730.206028-0.1150930.0246500.077726
分类汇总呢并求和:
data.pivot_table(index='key1',columns='key2',aggfunc='sum')
结果:
num1num2 key2onethreetwoonethreetwo key1 a0.5799960.7056570.203155-0.4972462.398164-1.293595 b0.1679470.2045450.6614600.555850-0.5225280.143530 c0.4969930.0336730.412055-0.1150930.0246500.155452
也可以使用其它自定义函数:
#定义一个最大值减最小值的函数 defmax_min(group): returngroup.max()-group.min()
data.pivot_table(index='key1',columns='key2',aggfunc=max_min)
结果:
num1num2 key2onethreetwoonethreetwo key1 a0.1792660.00.0003.1094050.00.000000 b0.0000000.00.0000.0000000.00.000000 c0.0000000.00.1770.0000000.01.609466
(2)通过groupby
普通的函数如mean,sum可以直接应用:
data.groupby(['key1','key2']).mean().unstack()
返回结果:
num1num2 key2onethreetwoonethreetwo key1 a0.1933320.7056570.203155-0.1657492.398164-1.293595 b0.1679470.2045450.6614600.555850-0.5225280.143530 c0.4969930.0336730.206028-0.1150930.0246500.077726
以上这篇用Python实现数据的透视表的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。