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()
运行结果: