pandas-groupby常见用法
groupby过程图解
总的来说,
groupby
的过程就是将原有的DataFrame
按照groupby
的字段(这里是company
),划分为若干个分组DataFrame
,被分为多少个组就有多少个分组DataFrame
。所以说,在groupby
之后的一系列操作(如agg
、apply
等),均是基于子DataFrame
的操作。理解了这点,也就基本摸清了Pandas中groupby
操作的主要原理。下面来讲讲groupby
之后的常见操作。
8个常见用法
代码地址(可在线预览)💻📲
加载 sklearn-鸢尾花 公开数据集
import pandasas pdfrom sklearnimport datasets# 加载数据集和目标
data, target= datasets.load_iris(return_X_y=True, as_frame=True)# 合并数据集和目标
iris= pd.concat([data, target], axis=1, sort=False)
iris
生成groupby对象
iris_gb= iris.groupby('target')type(iris_gb)
pandas.core.groupby.generic.DataFrameGroupBy
1. 创建频率表
假如我想知道每个species类中的数量有多少,那么直接使用groupby的size函数即可
iris_gb.size()
2. 计算常用的描述统计量
min、max()、medianhe、std等
# 计算均值
iris_gb.mean()
# 单列
iris_gb['sepal length (cm)'].mean()
# 双列
iris_gb[['sepal length (cm)','sepal width (cm)']].mean()
3. 查找最大值(最小值)索引
# 查找每个组的最大值或最小值的索引
iris_gb.idxmax()
# 查找每组sepal_length最大值对应的整条记录时,就可以这样用。注意,这里是整条记录,相当于按sepal_length最大值这个条件进行了筛选。
sepal_largest= iris.loc[iris_gb['sepal length (cm)'].idxmax()]
sepal_largest
4. groupby后重置索引
很多时候,在groupby处理后还要进行其他操作。也就是说,我们想重置分组索引以使其成为正常的行和列。 第一种方法可能大家常用,就是通过reset_index()让乱序索引重置。
iris_gb.max().reset_index()
但其实,还有一个看上去更加友好的用法。可以在groupby的时候就设置as_index参数,也可以达到同样效果。
iris.groupby('target', as_index=False).max()
5. 多种统计量汇总
上面都是单个统计量的操作,那如果我想同时操作好几个呢?
groupby还有一个超级棒的用法就是和聚合函数agg连起来使用。
iris_gb[['sepal length (cm)','sepal width (cm)']].agg(["min","mean"])
6. 特定列的聚合
上面是的多个操作对于每个列都是一样的。实际使用过程中,我们可能对于每个列的需求都是不一样的。
所以在这种情况下,可以通过为不同的列单独设置不同的统计量。
iris_gb.agg({"sepal length (cm)":["min","max"],"sepal width (cm)":["mean","std"]})
7. NamedAgg命名统计量
上面的多级索引看起来有点不太友好,我想把每个列下面的统计量和列名分别合并起来。可以使用NamedAgg来完成列的命名。
iris_gb.agg(
sepal_min=pd.NamedAgg(column="sepal length (cm)", aggfunc="min"),
sepal_max=pd.NamedAgg(column="sepal length (cm)", aggfunc="max"),
petal_mean=pd.NamedAgg(column="petal length (cm)", aggfunc="mean"),
petal_std=pd.NamedAgg(column="petal length (cm)", aggfunc="std"))
因为NamedAgg是一个元组,所以我们也可以直接赋值元组给新的命名,效果一样,但看上去更简洁。
iris_gb.agg(
sepal_min=("sepal length (cm)","min"),
sepal_max=("sepal length (cm)","max"),
petal_mean=("petal length (cm)","mean"),
petal_std=("petal length (cm)","std"))
8. 使用自定义函数
上面agg聚合函数中我们都是通过添加一个统计量名称来完成操作的,除此之外我们也可直接给一个功能对象。
iris_gb.agg(pd.Series.mean)
不仅如此,名称和功能对象也可一起使用。
iris_gb.agg(["min", pd.Series.mean])
还可以自定义函数
defdouble_length(x):return2*x.mean()
iris_gb.agg(double_length)
如果想更简洁,也可以使用lambda函数。总之,用法非常灵活,可以自由组合搭配。
iris_gb.agg(lambda x: x.mean())