Fork me on GitHub

pandas的透视表pivot_table使用及筛选

 

一、pivot_table透视表

首先读取数据,数据集是火箭队当家球星James Harden某一赛季比赛数据作为数据集进行讲解。数据地址

先看一下官方文档中pivot_table的函数体:pandas.pivot_table - pandas 0.21.0 documentation

pivot_table(data, values=None, index=None, columns=None,aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')

pivot_table有四个最重要的参数index、values、columns、aggfunc,本文以这四个参数为中心讲解pivot操作是如何进行。

2.1 读取数据

  1.  import pandas as pd
  2.  import numpy as np
  3.  df = pd.read_csv('h:/James_Harden.csv',encoding='utf8')
  4.  df.tail()

数据格式如下:

2.2 Index

每个pivot_table必须拥有一个index,如果想查看哈登对阵每个队伍的得分,首先我们将对手设置为index

pd.pivot_table(df,index=[u'对手'])

对手成为了第一层索引,还想看看对阵同一对手在不同主客场下的数据,试着将对手与胜负与主客场都设置为index,其实就变成为了两层索引

pd.pivot_table(df,index=[u'对手',u'主客场'])

 

试着交换下它们的顺序,数据结果一样:

pd.pivot_table(df,index=[u'主客场',u'对手'])

 

看完上面几个操作,Index就是层次字段,要通过透视表获取什么信息就按照相应的顺序设置字段,所以在进行pivot之前你也需要足够了解你的数据。

2.3 Values

通过上面的操作,我们获取了james harden在对阵对手时的所有数据,而Values可以对需要的计算数据进行筛选,如果我们只需要james harden在主客场和不同胜负情况下的得分、篮板与助攻三项数据:

pd.pivot_table(df,index=[u'主客场',u'胜负'],values=[u'得分',u'助攻',u'篮板'])

 

2.4 Aggfunc

aggfunc参数可以设置我们对数据聚合时进行的函数操作。

当我们未设置aggfunc时,它默认aggfunc='mean'计算均值。我们还想要获得james harden在主客场和不同胜负情况下的总得分、总篮板、总助攻时:

pd.pivot_table(df,index=[u'主客场',u'胜负'],values=[u'得分',u'助攻',u'篮板'],aggfunc=[np.sum,np.mean])

 

2.5 Columns

Columns类似Index可以设置列层次字段,它不是一个必要参数,作为一种分割数据的可选方式。

  1.  #fill_value填充空值,margins=True进行汇总
  2.  pd.pivot_table(df,index=[u'主客场'],columns=[u'对手'],values=[u'得分'],aggfunc=[np.sum],fill_value=0,margins=1)

 

现在我们已经把关键参数都介绍了一遍,下面是一个综合的例子:

table=pd.pivot_table(df,index=[u'对手',u'胜负'],columns=[u'主客场'],values=[u'得分',u'助攻',u'篮板'],aggfunc=[np.mean],fill_value=0)

结果如下:

 

aggfunc也可以使用dict类型,如果dict中的内容与values不匹配时,以dict中为准。

 

二、筛选表

pandas暂未查到有筛选功能,自定义一个:

import pandas as pd
def df_screen(df, cd):
'''表筛选
df:pd.DataFrame
cd: {字段:[条件1,条件2],} 数据格式字典
'''
df_cy = df.copy()
idx_z = [True for i in df_cy.index]

orcom = lambda a, b: [any([a[i], b[i]]) for i in range(len(a))] # 列表a与列表b两两 或 比较
addcom = lambda a, b: [all([a[i], b[i]]) for i in range(len(a))] # 列表a与列表b两两 与 比较
for z in cd:
if isinstance(cd[z], list):
for index, c in enumerate(cd[z]):#z:字典的字段,’车型'/'类型'/'销量'列名;cd[z]为字典里对应的条件列表
if index != 0:
idx_c = orcom(idx_c, list(df_cy[z] == c))
else:
idx_c = list(df_cy[z] == c)#筛选z列为c:['皓影','本田CR-V']
else:
idx_c = list(df_cy[z] == cd[z])
idx_z = addcom(idx_z, idx_c)
return df_cy.loc[idx_z, :]
test = pd.DataFrame({'车型': ['皓影', '皓影', '皓影', '皓影', '皓影', '皓影', '皓影', '皓影', '皓影', '皓影', '本田CR-V', '本田CR-V', '本田CR-V', '本田CR-V', '本田CR-V', '本田CR-V', '本田CR-V', '本田CR-V'], '新能源类型': ['传统燃料', '传统燃料', '传统燃料', '常规混合动力', '传统燃料', '传统燃料', '传统燃料', '传统燃料', '常规混合动力', '常规混合动力', '传统燃料', '传统燃料', '传统燃料', '传统燃料', '常规混合动力', '常规混合动力', '插电式混合动力', '插电式混合动力'], '销量': [4, 176, 1, 35, 3, 1, 774, 38, 167, 17, 8, 1, 267, 3, 35, 3, 2, 1]})
cd = {'车型':['皓影','本田CR-V'],'新能源类型':['传统燃料','常规混合动力'],'销量':[1]}
cd1 = {'车型':['皓影','本田CR-V'],'新能源类型':'传统燃料','销量':1}
tem=df_screen(test,cd1)
print(tem)

posted @ 2020-02-17 19:24  iamorz  阅读(1869)  评论(1编辑  收藏  举报