Pandas数据分析之pandas数据透视表和交叉表

目录

前言

整理透视 pivot 

聚合透视 Pivot Table

 聚合透视高级操作

交叉表crosstab()

数据融合melt()

数据堆叠 stack

前言

pandas对数据框也可以像excel一样进行数据透视表整合之类的操作。主要是针对分类数据进行操作,还可以计算数值型数据,去满足复杂的分类数据整理的逻辑。

首先还是导入包:

import numpy as np import pandas as pd 整理透视 pivot 

首先介绍的是最简单的整理透视函数pivot,其原理如图:

pivot参数:

index:新 df 的索引列,用于分组,如果为None,则使用现有索引

columns:新 df 的列,如果透视后有重复值会报错

values:用于填充 df 的列。 如果未指定,将使用所有剩余的列,并且结果将具有按层次结构索引的列

用法如下,首先生成案例数据df

df = pd.DataFrame({'foo': ['one', 'one', 'one', 'two', 'two', 'two'], 'bar': ['A', 'B', 'C', 'A', 'B', 'C'], 'baz': [1, 2, 3, 4, 5, 6], 'zoo': ['x', 'y', 'z', 'q', 'w', 't']}) df

df.pivot(index='foo', columns='bar', values='baz')

可以看到是一一对应。简单来说就是把foo、bar两个分类变量整到行列名称上去了,baz作为值

# 多层索引,可以取其中一列 df.pivot(index='foo', columns='bar') #['baz']

# 指定值 df.pivot(index='foo', columns='bar', values=['baz', 'zoo'])

聚合透视 Pivot Table

上面的pivot只适用于一一对应的情况,如果分类变量的组合一样,但是取值不一样就会报错。此时应该用Pivot Table,他默认计算相同情况的均值。

参数:

data: 要透视的 DataFrame 对象

values: 要聚合的列或者多个列

index: 在数据透视表索引上进行分组的键

columns: 在数据透视表列上进行分组的键

aggfunc: 用于聚合的函数, 默认是 numpy.mean'''

df = pd.DataFrame({"A": ["a1", "a1", "a1", "a2", "a2","a2"], "B": ["b2", "b2", "b1", "b1", "b1","b1"], "C": ['c1','c1','c2','c2','c1','c1'], "D": [1, 2, 3, 4, 5, 6]}) df

#索引a,列b使用Pivot会报错,因为他们之间的组合有重复,要用Pivot Table,默认计算均值 pd.pivot_table(df,index='A',columns='B',values='D')

#验证一下b1,a2这个均值5 df.loc[(df.A=='a2')&(df.B=='b1')].D.mean()

 聚合透视高级操作 pd.pivot_table(df,index=['A','B'],#指定多个索引 columns=['C'], #指定列 values='D', #数据值列 aggfunc=np.sum, #聚合函数 fill_value=0, #空值填充 margins=True #增加汇总列 )

 #多个计算方法

pd.pivot_table(df,index=['A','B'],#指定多个索引 columns=['C'], #指定列 values='D', #数据值列 aggfunc=[np.sum,np.mean,np.std] )

交叉表crosstab()

交叉表是用于统计分组频率的特殊透视表。简单来说,就是将两个或者多个列重中不重复的元素组成一个新的 DataFrame,新数据的行和列交叉的部分值为其组合在原数据中的数量

语法结构如下:

pd.crosstab(index, columns, values=None, rownames=None,colnames=None, aggfunc=None, margins=False,
margins_name: str = 'All', dropna: bool = True,normalize=False) #→ 'DataFrame'

参数说明:

index:类数组,在行中按分组的值。
columns:类数组的值,用于在列中进行分组。
values:类数组的,可选的,要根据因素汇总的值数组。
aggfunc:函数,可选,如果未传递任何值数组,则计算频率表。
rownames:序列,默认为None,必须与传递的行数组数匹配。
colnames:序列,默认值为None,如果传递,则必须与传递的列数组数匹配。
margins:布尔值,默认为False,添加行/列边距(小计)
normalize:布尔值,{'all','index','columns'}或{0,1},默认为False。 通过将所有值除以值的总和进行归一化。'

生成案例数据:

df = pd.DataFrame({"A": ["a1", "a1", "a1", "a2", "a2","a2"], "B": ["b2", "b2", "b1", "b1", "b1","b1"], "C": ['c1','c1','c2','c2','c1','c1'], "D": [1, 2, 3, 4, 5, 6]}) df

pd.crosstab(df['A'],df['B']) #都是分类数据,计算频率

pd.crosstab(df['A'],df['C']) #都是分类数据

#对交叉结果进行归一化: pd.crosstab(df['A'], df['B'], normalize=True)

#对每列进行归一化: pd.crosstab(df['A'], df['B'], normalize='columns')

#聚合,指定列做为值,并将这些值按一定算法进行聚合: pd.crosstab(df['A'], df['C'], values=df['D'], aggfunc=np.sum) #分类和数值

#边距汇总,在最右边增加一个汇总列: pd.crosstab(df['A'], df['B'],values=df['D'],aggfunc=np.sum, normalize=True,margins=True)

数据融合melt()

#df.melt() 是 df.pivot() 逆转操作函数。简单说就是将指定的列放到铺开放到行上名为variable(可指定)列,值在value(可指定)列 

语法结构:

具体语法结构如下:

pd.melt(frame: pandas.core.frame.DataFrame,id_vars=None, value_vars=None,         var_name='variable', value_name='value',col_level=None)

其中:

id_varstuple:list或ndarray(可选),用作标识变量的列。

value_varstuple:列表或ndarray,可选,要取消透视的列。 如果未指定,则使用未设置为id_vars的所有列。

var_namescalar:用于“变量”列的名称。 如果为None,则使用frame.columns.name或“variable”。

value_namescalar:默认为“ value”,用于“ value”列的名称。

col_levelint或str:可选,如果列是MultiIndex,则使用此级别来融化。

生成案例数据:

df=pd.DataFrame({'A':['a1','a2','a3','a4','a5'], 'B':['b1','b2','b3','b4','b5'], 'C':[1,2,3,4,5]}) df

pd.melt(df)

#指定标识和值, pd.melt(df,id_vars=['A']) #只对BC展开

pd.melt(df,value_vars=['B','C']) #保留BC,并展开

#同时指定,并命名 pd.melt(df,id_vars=['A'],value_vars=['B'],var_name='B_label',value_name='B_value')

数据堆叠 stack

#stack就是把列变量堆到行上,unstack就是行变到列上

生成案例数据 :

#堆叠 stack 单层索引: df = pd.DataFrame({'A':['a1','a1','a2','a2'], 'B':['b1','b2','b1','b2'], 'C':[1,2,3,4], 'D':[5,6,7,8], 'E':[5,6,7,8]}) df.set_index(['A','B'],inplace=True) df

 stack 堆叠

df.stack()

 unstack 解堆

df.stack().unstack()

df.stack().unstack().unstack()

df.stack().unstack().unstack().unstack()

 可以看到,解堆就是不停地把列变量弄到行上去作为索引。

到此这篇关于Pandas数据分析之pandas数据透视表和交叉表的文章就介绍到这了,更多相关pandas数据透视表内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!

推荐阅读

    英特尔四主流核心处理器交叉评论

    英特尔四主流核心处理器交叉评论,,2009年1月8日,AMD公司生产的前两个桌面的45纳米工艺处理器——,——,Phenom II X4 940和Phenom II X4 920,

    如何设置交叉引用|交叉引用使用方法

    如何设置交叉引用|交叉引用使用方法,,1. 交叉引用使用方法是的。论文引用参考文献,要遵循规则,就像致谢一样,参考文献部分也需要遵循的特定规

    Word 2010怎么创建交叉引用 Word 2010创建交叉引用的使用教程【详解】

    Word 2010怎么创建交叉引用 Word 2010创建交叉引用的使用教程【详解】,交叉引用,单击,选择,使用教程,引用,位置,  一些用户们在使用Word 2010

    Word的交叉引用是什么

    Word的交叉引用是什么,引用,交叉引用,单击,编号,位置,文档,  交叉引用是对Microsoft Word文档中其他位置的内容的引用,例如,可为标题、脚注、书

    Python中的pandas库详解

    Python中的pandas库详解,数据,数据处理,方法,排序,合并,筛选,Python是一门高效且易于学习的编程语言,在数据处理方面也有着出色表现。其中,pandas

    pr交叉淡化转场快捷键|pr过场快捷键

    pr交叉淡化转场快捷键|pr过场快捷键,,1. pr过场快捷键PR快捷键1、 ctrl+D :给视频添加转场2、 shift+D :给音频和视频同时添加转场(音频默认

    交叉线设置(交叉线用在哪)

    交叉线设置(交叉线用在哪),1. 交叉线用在哪直通网线与交叉网线的区别如下:1、直通网线直连线,同一根网线的两端使用同样的线序。即网线的两

    Css和HTML的交叉用途

    Css和HTML的交叉用途,CssHTML,应该,使用,层,叠,样式,表,(,CSS,),,来,,应该使用层叠样式表(CSS)来定义 HTML 元素的布局和显示属性<!DOCTYPE>