Python数据分析,办公自动化,如何数据分组与透视?
数据分组是对 相同类别 的数据进行汇总,而数据透视表是通过对行或列的不同组合 对数据进行汇总,所使用的汇总方法有求和、计数、平均值、标准差等,本文使用Python对数据进行数据分组和数据透视,下面一起来学习。一、groupby分组
这里首先导入pandas和datetime库,生成一个包含"用户ID","日期","城市","年龄","性别","成交量"的DataFrame数据。 import pandas as pd import datetimedf = pd.DataFrame({"用户ID":[1001,1002,1003,1004,1005,1006], "日期":pd.date_range(datetime.datetime(2021,3,23),periods=6), "城市":["北京", "上海", "广州", "上海", "杭州", "北京"], "年龄":[23,44,54,32,34,32], "性别":["F","M","M","F","F","F"], "成交量":[3200,1356,2133,6733,2980,3452]}, columns =["用户ID","日期","城市","年龄","性别","成交量"]) df
groupby可以通过传入需要分组的参数实现对数据的分组,参数可以是单列,也可以是多列,分组后可以对单列进行函数处理,也可以对多列进行函数处理。 #按照单列分组 df.groupby("城市").count()#按照单列分组 df.groupby("城市")["用户ID"].count()
先筛选列再groupby与先groupby再筛选列得出来的结果是一样的。 # 先筛选,然后groupby要加df df["成交量"].groupby([df["城市"],df["性别"]]).sum()
如果先聚合,聚合列可以只写列名,不加变量名,因为没有筛选某列前,可以直接搜索到列。 #先groupby()再写列,列不用加df df.groupby(["城市","性别"])["成交量"].count() #计数
#先groupby()再写列,列不用加df df.groupby(["城市","性别"])["成交量"].sum() #求和
使用unstack函数,增加数据透视的效果。 # 增加透视效果 df["成交量"].groupby([df["城市"],df["性别"]]).sum().unstack()
as_index=False,会按从0开始的数据索引。 #分组键一般会作为分层索引,如果不想要,可以在group()中加上参数:as_index=False,会按从0开始的数据索引 df.groupby([df["城市"], df["性别"]],as_index=False).sum()
先数据分组,然后做描述分析。 df.groupby("城市").describe()
size显示数据组分类的多少。 df.groupby("城市").size()
二、group by与agg的用法
groupby与agg两者可以结合使用,可以对单列或多列进行单一或多个不同的聚合运算, 常用聚合函数有count,sum,std等,直接用函数名加引号即可,如果有多个函数时,可以用逗号隔开; # 常用聚合函数用引号即可引用 df.groupby(["城市", "性别"]).agg("sum")
列表可以同时使用多个函数,用逗号隔开。 # 列表可以同时使用多个函数 df.groupby(["城市", "性别"]).agg(["mean","std","sum","count"])
reset_index用来重置索引。 # 列表可以同时使用多个函数 df.groupby(["城市", "性别"]).agg(["mean","std","sum","count"]).reset_index()
用元组修改函数名。 # 可以用元组修改函数名 df.groupby(["城市", "性别"]).agg([("No.1", "sum"), ("No.2", "std")])
可以对不同的列使用不同的函数进行运算。 #如果不同列用不同函数,可以对不同的列使用不同的函数 df.groupby(["城市", "性别"]).agg({"年龄": ["max","min"],"成交量": ["sum", "count", "std"]})
三、apply与agg的用法
apply与agg相同点:都可以对分组后的结果进行运算;
apply与agg不同点:agg只能对单列,apply可以对多列进行;apply可以使用匿名函数,agg不可以使用匿名函数。 #首先定义一个top函数,使用apply函数进行运算 def top(df, n=2, column="成交量"): return df.sort_values(by=column)[-n:] # 自建函数 df.groupby("城市").apply(top)
直接使用apply函数进行聚合运算。 df.groupby("城市").apply(top, n=3, column="成交量")
四、cut与qcut的用法
qcut是等样本数,cut是等值区间分,groupby和cut和qcut结合使用,可以对等值或等样本数分组后的结果进行分析。 #使用numpy生成两个随机数 import numpy as np df = pd.DataFrame({"data1":np.random.randn(1000), "data2": np.random.randn(1000)}) df.head()
将数据data1等值区间四等分。 #将数据data1等值区间四等分 quariles = pd.cut(df.data1, 4) quariles[:10]
数据data1等样本数四等分。 #将数据data1等样本数四等分 quriles_1 = pd.qcut(df.data1,4) quriles_1[:10]五、apply与applymap的用法
apply函数主要用于对DataFrame中的某一column或row中的元素执行相同的函数操作,而applymap函数主要用于对DataFrame中每一个元素执行系统的操作,apply和applymap都要与lambda结合使用。#首先生成A,B,C的一个随机数组 import numpy as np df = pd.DataFrame({"A":np.random.rand(3), "B": np.random.rand(3), "C": np.random.rand(3) }) df.head()
使用apply函数,对A列的每一个元素加1。#对A列的每一个元素加1 df["A"].apply(lambda x:x+1)
使用applymap对表内的每个元素加1。#对表内的每个元素加1 df.applymap(lambda x:x+1)
定义一个get函数,对data2数据使用apply函数做聚合运算。 def get(group): return {"min":group.min(),"max":group.max(),"count": group.count(),"mean": group.mean()} df.data2.groupby(quariles).apply(get)
使用unstack函数显示数据透视表效果。 df.data2.groupby(quariles).apply(get).unstack()
labels=False采用默认的0开始的索引。 # 去掉分组数值lable,采用默认的0开始的索引 q = pd.qcut(df.data1, 10, labels=False) df.data2.groupby(q).apply(get).unstack()六、数据透视表
数据透视表使用的是pivot_table函数,接下来介绍该函数使用最多的几个参数。data表示使用数据透视表数据,values表示计算值,index表示数据透视的行,columns表示数据透视的列,aggfunc表示计算类型,margins表示是否显示合计列,margins_name表示合计列的名字。 pivot_table(data, values=None, index=None, columns=None, aggfunc="mean", fill_value=None, margins=False, dropna=True, margins_name="All")
margins显示合计,并且margins_name修改合计名称。 #margins显示合计,margins_name修改合计名称 pd.pivot_table(df,values = "用户ID",columns ="性别",index="城市",aggfunc="count",margins = True,margins_name ="合计")
当数据透视结果有缺失值时,用fill_value = 0缺失值填充。 #fill_value = 0缺失值填充 pd.pivot_table(df,values = "用户ID",columns ="性别",index="城市",aggfunc="count",fill_value = 0)
aggfunc={"用户ID":"count","成交量":"sum"},对用户ID做计数运算,对成交量做求和运算。 pd.pivot_table(df,values = ["用户ID","成交量"],columns="性别",index="城市",aggfunc={"用户ID":"count","成交量":"sum"},fill_value = 0)
reset_index对数据透视结果重置索引。 pd.pivot_table(df,values = ["用户ID","成交量"],columns="性别",index="城市",aggfunc={"用户ID":"count","成交量":"sum"},fill_value = 0).reset_index()