Pandas进阶——透视表和交叉表

  一、透视表

  1、什么是透视表

  透视表是各种电子表格程序和其他数据分析软件中一种常见的数据汇总工具。它根据一个或多个键对数据进行聚合,并根据行和列上得分组建将数据分配到各个矩形区域中。在pandas中,可以通过pivot_table函数创建透视表。

   2、透视表参数 

DataFrame.pivot_table(self, values=None, index=None, columns=None,ggfunc='mean', fill_value=None,.margins=False,dropna=True, margins_name='All')

 

  3、示例及其输出

# 示例
data = {'A': [1, 2, 2, 3, 2, 4],
        'B': [2014, 2015, 2014, 2014, 2015, 2017],
        'C': ["a", "b", "c", "d", "e", "f"],
        'D': [0.5, 0.9, 2.1, 1.5, 0.5, 0.1]
        }
df = pd.DataFrame(data)
df.pivot_table(index=["B"], columns=["C"], values=["A"], aggfunc=sum, margins=True)
# 输出
        A
C       a    b    c    d    e    f All
B
2014  1.0  NaN  2.0  3.0  NaN  NaN   6
2015  NaN  2.0  NaN  NaN  2.0  NaN   4
2017  NaN  NaN  NaN  NaN  NaN  4.0   4
All   1.0  2.0  2.0  3.0  2.0  4.0  14

  二、交叉表

  1、什么是交叉表

  交叉表是一种用于计算分组频率的特殊透视表。通常使用crosstab函数来创建交叉表。

  2、crosstab参数

1 pd.crosstab(index,columns,values=None,rownames=None
2 ,colnames=None,aggfunc=None,margins=False,dropna=True,normalize=False)

  3、示例

# 示例
data = {'A': [1, 2, 2, 3, 2, 4],
        'B': [2014, 2015, 2014, 2014, 2015, 2017],
        'C': ["a", "b", "c", "d", "e", "f"],
        'D': [0.5, 0.9, 2.1, 1.5, 0.5, 0.1]
        }
df = pd.DataFrame(data)
pd.crosstab(index=[df["B"],df["A"]], columns=df["C"], values=df["A"], aggfunc=sum, margins=True)
# 输出
C         a    b    c    d    e    f  All
B    A
2014 1  1.0  NaN  NaN  NaN  NaN  NaN    1
     2  NaN  NaN  2.0  NaN  NaN  NaN    2
     3  NaN  NaN  NaN  3.0  NaN  NaN    3
2015 2  NaN  2.0  NaN  NaN  2.0  NaN    4
2017 4  NaN  NaN  NaN  NaN  NaN  4.0    4
All     1.0  2.0  2.0  3.0  2.0  4.0   14

  三、实例分析

  使用Pandas中的read_csv函数加载step2/tip.csv文件中的数据集,分别用透视表和交叉表统计顾客在每种用餐时间(time)、每个星期下(day)的小费(tip)总和情况。

  代码:

import pandas as pd

#创建透视表
def create_pivottalbe(data):
    df = pd.DataFrame(data)
    return df.pivot_table(index=["day"],columns=["time"],values=["tip"],aggfunc=sum, margins=True)
 
#创建交叉表
def create_crosstab(data):
    df = pd.DataFrame(data)
    return pd.crosstab(index=df["day"], columns=df["time"], values=df["tip"], aggfunc=sum, margins=True)

def main():
    #读取csv文件数据并赋值给data
    data=pd.read_csv('step2/tip.csv')
    piv_result = create_pivottalbe(data)
    cro_result = create_crosstab(data)
    print("透视表:\n{}".format(piv_result))
    print("交叉表:\n{}".format(cro_result))

if __name__ == '__main__':
    main()

  运行结果:

 

posted @ 2020-03-01 19:58  陈康、  阅读(1187)  评论(0编辑  收藏  举报