zoukankan      html  css  js  c++  java
  • 2018.03.29 python-pandas 数据透视pivot table / 交叉表crosstab

     1 #透视表 pivot table
     2 #pd.pivot_table(data,values=None,index=None,columns=None,
     3 import numpy as np
     4 import pandas as pd              aggfunc='mean',fill_value=None,margins=False,dropna=True,margins_name='ALL')
     5 date = ['2017-5-1','2017-5-2','2017-5-3']*3
     6 rng = pd.to_datetime(date)
     7 df = pd.DataFrame({'date':rng,
     8                    'key':list('abcdabcda'),
     9                    'values':np.random.rand(9)*10})
    10 print(df)
    11 print('-----')
    12 
    13 print(pd.pivot_table(df,values = 'values',index = ['date'],columns='key',aggfunc=np.sum))#也可以aggfunc='sum'
    14 print('-----')
    15 #data:DataFrame对象
    16 #values:要聚合的列或列的列表
    17 #index:数据透视的index,从原始数据的列中筛选
    18 #columns:数据透视表的columns,从原始数据的列中筛选
    19 #aggfunc:用于聚合的函数,默认为numpy,mean,支持numpy计算方法
    20 print(pd.pivot_table(df,values = 'values',index = ['date','key'],aggfunc=len))
    21 print('------')
    22 #这里就分别以date,key共同做数据透视,值为values:统计不同(date,key)情况下values的计数
    23 #aggfunc=len(或者count):计数

    结果:
            date key    values
    0 2017-05-01   a  2.562157
    1 2017-05-02   b  9.604823
    2 2017-05-03   c  4.770968
    3 2017-05-01   d  0.654878
    4 2017-05-02   a  8.839281
    5 2017-05-03   b  1.211138
    6 2017-05-01   c  9.570886
    7 2017-05-02   d  9.915021
    8 2017-05-03   a  8.551166
    -----
    key                a         b         c         d
    date                                             
    2017-05-01  2.562157       NaN  9.570886  0.654878
    2017-05-02  8.839281  9.604823       NaN  9.915021
    2017-05-03  8.551166  1.211138  4.770968       NaN
    -----
                    values
    date       key       
    2017-05-01 a       1.0
                 c       1.0
                 d       1.0
    2017-05-02 a       1.0
                 b       1.0
                 d       1.0
    2017-05-03 a       1.0
                 b       1.0
                 c       1.0
    ------

     1 #交叉表:crosstab
     2 #默认情况下,crosstab计算因子的频率,比如用于str的数据透视分析
     3 #pd.crosstab(index,columns,values=None,rownames=None
     4 #            ,colnames=None,aggfunc=None,margins=False,dropna=True,normalize=False)
     5 df = pd.DataFrame({'A':[1,2,2,2,2],
     6                    'B':[3,3,4,4,4],
     7                    'C':[1,1,np.nan,1,1]})
     8 print(df)
     9 print('------')
    10 print(pd.crosstab(df['A'],df['B']))
    11 print('------')
    12 #如果crosstab只接收两个series,他将提供一个频率表
    13 #用A的唯一值,统计B唯一值的出现次数  (A,B)= (1,3)C出现了1次   (A,B)= (2,4)出现了3次
    14 
    15 print(pd.crosstab(df['A'],df['B'],normalize=True))#以频率的方式显示
    16 print('--------')
    17 print(pd.crosstab(df['A'],df['B'],values=df['C'],aggfunc=np.sum))#values:根据因子聚合的值数组
    18 #aggfunc:如果未传递values数组,则计算频率表,如果传递数组,则按照指定计算
    19 #这里相当于以A和B界定分组,计算出每组中第三个系列C的值
    20 print('--------')
    21 print(pd.crosstab(df['A'],df['B'],values=df['C'],aggfunc=np.sum,margins=True))
    22 print('--------')
    23 #margins:布尔值,默认值False,添加行/列边距(小计)

    结果:
       A  B    C
    0  1  3  1.0
    1  2  3  1.0
    2  2  4  NaN
    3  2  4  1.0
    4  2  4  1.0
    ------
    B  3  4
    A     
    1  1  0
    2  1  3
    ------
    B    3    4
    A         
    1  0.2  0.0
    2  0.2  0.6
    --------
    B    3    4
    A         
    1  1.0  NaN
    2  1.0  2.0
    --------
    B      3    4  All
    A                
    1    1.0  NaN  1.0
    2    1.0  2.0  3.0
    All  2.0  2.0  4.0
    --------

  • 相关阅读:
    『C#基础』数据库死锁笔记
    『C#基础』IIS的权限问题
    『C#基础』调用CMD的一个小工具
    『C#基础』获取系统图标的一个操作类
    『程序人生』其实,做软件与打游戏是一样一样的……
    『C#基础』C#调用存储过程
    『Linux』Arch Linux与VirtualBox的结合
    sql server 触发器简单学习
    用触发器替换原来的insert
    食物增肥一方
  • 原文地址:https://www.cnblogs.com/jxzhu/p/8669310.html
Copyright © 2011-2022 走看看