Python 做数据分组的8个最常用技巧

pandasgroupby是数据处理中一个非常强大的功能。虽然很多同学已已经非常熟悉了,但有些小技巧还是要和大家普及一下的。

为了给大家演示,我们采用一个公开的数据集进行说明。

import pandas as pd
iris = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv')

随机采样5条,数据是长这样子的。

>>> iris.sample(5)
     sepal_length  sepal_width  petal_length  petal_width     species
95            5.7          3.0           4.2          1.2  versicolor
71            6.1          2.8           4.0          1.3  versicolor
133           6.3          2.8           5.1          1.5   virginica
4             5.0          3.6           1.4          0.2      setosa
33            5.5          4.2           1.4          0.2      setosa

因为是分组功能,所以被分的对象肯定是类别型的。在这个数据里,这里我们就以species进行分组举例。

首先,以species分组创建一个groupbyobject。这里单独生成groupby对象是因为后面会反复用到,其实用的熟练了直接链接起来就可以了。

iris_gb = iris.groupby('species')

技术交流

技术要学会分享、交流,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。

好的文章离不开粉丝的分享、推荐,资料干货、资料分享、数据、技术交流提升,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、添加微信号:dkl88194,备注:来自CSDN + python
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:python

一、创建频率表

假如我想知道每个species类中的数量有多少,那么直接使用groupbysize函数即可,如下。

>>> iris_gb.size()
species
setosa        50
versicolor    50
virginica     50
dtype: int64

二、计算常用的描述统计量

比如,我想要按组计算均值,那么就用mean()函数。

>>> # 计算均值
>>> iris_gb.mean()
            sepal_length  sepal_width  petal_length  petal_width
species                                                         
setosa             5.006        3.428         1.462        0.246
versicolor         5.936        2.770         4.260        1.326
virginica          6.588        2.974         5.552        2.026

默认情况下如果没有限制,那么mean()函数将对所有变量特征计算均值。如果我希望只计算某一个变量的均值,可以指定该变量,如下所示。

>>> # 单列
>>> iris_gb['sepal_length'].mean()
species
setosa        5.006
versicolor    5.936
virginica     6.588
Name: sepal_length, dtype: float64
>>> # 双列
>>> iris_gb[['sepal_length', 'petal_length']].mean()
            sepal_length  petal_length
species                               
setosa             5.006         1.462
versicolor         5.936         4.260
virginica          6.588         5.552

同理,其它描述性统计量minmax()medianhestd都是一样的用法。

三、查找最大值(最小值)的索引

如果我们要查找每个组的最大值或最小值的索引时,有一个方便的功能可以直接使用。

>>> iris_gb.idxmax()
            sepal_length  sepal_width  petal_length  petal_width
species                                                         
setosa                14           15            24           43
versicolor            50           85            83           70
virginica            131          117           118          100

如何应用呢?

比如我们想查找每组sepal_length最大值对应的整条记录时,就可以这样用。注意,这里是整条记录,相当于按sepal_length最大值这个条件进行了筛选。

>>> sepal_largest = iris.loc[iris_gb['sepal_length'].idxmax()]
>>> sepal_largest
     sepal_length  sepal_width  petal_length  petal_width     species
14            5.8          4.0           1.2          0.2      setosa
50            7.0          3.2           4.7          1.4  versicolor
131           7.9          3.8           6.4          2.0   virginica

四、Groupby之后重置索引

很多时候,我们在groupby处理后还要进行其他操作。也就是说,我们想重置分组索引以使其成为正常的行和列。

第一种方法可能大家常用,就是通过reset_index()让乱序索引重置。

>>> iris_gb.max().reset_index()
      species  sepal_length  sepal_width  petal_length  petal_width
0      setosa           5.8          4.4           1.9          0.6
1  versicolor           7.0          3.4           5.1          1.8
2   virginica           7.9          3.8           6.9          2.5

但其实,还有一个看上去更加友好的用法。可以在groupby的时候就设置as_index参数,也可以达到同样效果。

>>> iris.groupby('species', as_index=False).max()
      species  sepal_length  sepal_width  petal_length  petal_width
0      setosa           5.8          4.4           1.9          0.6
1  versicolor           7.0          3.4           5.1          1.8
2   virginica           7.9          3.8           6.9          2.5

五、多种统计量汇总

上面都是单个统计量的操作,那如果我想同时操作好几个呢?

groupby还有一个超级棒的用法就是和聚合函数agg连起来使用。

>>> iris_gb[['sepal_length', 'petal_length']].agg(["min", "mean"])

           sepal_length        petal_length       
                    min   mean          min   mean
species                                           
setosa              4.3  5.006          1.0  1.462
versicolor          4.9  5.936          3.0  4.260
virginica           4.9  6.588          4.5  5.552

agg里面,我们只要列出统计量的名称即可,便可同时对每个列进行多维度统计。

六、特定列的聚合

我们也看到了,上面是的多个操作对于每个列都是一样的。实际使用过程中,我们可能对于每个列的需求都是不一样的。

所以在这种情况下,我们可以通过为不同的列单独设置不同的统计量。

>>> iris_gb.agg({"sepal_length": ["min", "max"], "petal_length": ["mean", "std"]})
           sepal_length      petal_length          
                    min  max         mean       std
species                                            
setosa              4.3  5.8        1.462  0.173664
versicolor          4.9  7.0        4.260  0.469911
virginica           4.9  7.9        5.552  0.551895

7、NamedAgg命名统计量

现在我又有新的想法了。上面的多级索引看起来有点不太友好,我想把每个列下面的统计量和列名分别合并起来。可以使用NamedAgg来完成列的命名。

>>> iris_gb.agg(
...     sepal_min=pd.NamedAgg(column="sepal_length", aggfunc="min"),
...     sepal_max=pd.NamedAgg(column="sepal_length", aggfunc="max"),
...     petal_mean=pd.NamedAgg(column="petal_length", aggfunc="mean"),
...     petal_std=pd.NamedAgg(column="petal_length", aggfunc="std")
... )
            sepal_min  sepal_max  petal_mean  petal_std
species                                                
setosa            4.3        5.8       1.462   0.173664
versicolor        4.9        7.0       4.260   0.469911
virginica         4.9        7.9       5.552   0.551895

因为NamedAgg是一个元组,所以我们也可以直接赋值元组给新的命名,效果一样,但看上去更简洁。

iris_gb.agg(
    sepal_min=("sepal_length", "min"),
    sepal_max=("sepal_length", "max"),
    petal_mean=("petal_length", "mean"),
    petal_std=("petal_length", "std")
)

八、使用自定义函数

上面agg聚合函数中我们都是通过添加一个统计量名称来完成操作的,除此之外我们也可直接给一个功能对象。

>>> iris_gb.agg(pd.Series.mean)
            sepal_length  sepal_width  petal_length  petal_width
species                                                         
setosa             5.006        3.428         1.462        0.246
versicolor         5.936        2.770         4.260        1.326
virginica          6.588        2.974         5.552        2.026

不仅如此,名称和功能对象也可一起使用。

iris_gb.agg(["min", pd.Series.mean])

更骚的是,我们还可以自定义函数,也都是可以的。

>>> def double_length(x):
...     return 2*x.mean()
... 
>>> iris_gb.agg(double_length)
            sepal_length  sepal_width  petal_length  petal_width
species                                                         
setosa            10.012        6.856         2.924        0.492
versicolor        11.872        5.540         8.520        2.652
virginica         13.176        5.948        11.104        4.052

当然如果想更简洁,也可以使用lambda函数。总之,用法非常灵活,可以自由组合搭配。

iris_gb.agg(lambda x: x.mean())

以上就是使用groupby过程中可能会用到的8个操作,如果你熟练使用起来会发现这个功能是真的很强大。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 利用Python进行数据分析,首先需要准备数据集。数据集可以来源于多种途径,比如网页爬取、数据库查询、文件导入等等。在数据集准备好后,就可以通过Python中的数据分析库进行数据的处理和分析。 Python中最常用数据分析库是Pandas和Numpy。Pandas提供了丰富的数据结构和数据处理函数,可以对数据进行清洗、过滤、转换等操作。Numpy是Python中的数值计算库,提供了大量的数学和统计函数,可以方便地进行数据分析和计算。 首先,我们可以使用Pandas将数据集导入到Python中。Pandas提供了多种数据导入函数,比如read_csv、read_excel等,可以根据数据集的格式选择合适的函数进行导入。 导入数据后,我们可以使用Pandas对数据进行初步的处理和探索。比如查看数据的基本信息,包括数据的列名、数据类型、缺失值等。可以使用head()函数查看数据的前几行,使用describe()函数查看数据统计特征。 接下来,我们可以使用Pandas和Numpy进行数据清洗和转换。比如,对于缺失值可以选择删除或填充;对于异常值可以选择删除或修复;可以进行数据类型的转换;可以进行数据的标准化或归一化等。 之后,我们可以使用Pandas和Numpy进行数据分析。比如,使用groupby()函数进行数据分组和聚合,使用plot()函数进行数据可视化,使用统计函数进行数据分析等。还可以使用其他的数据分析库,比如Matplotlib和Seaborn进行高级的数据可视化。 最后,我们可以使用Python中的其他库进行更深入的数据分析。比如,可以使用Scikit-learn进行机器学习模型的建立和训练;可以使用TensorFlow进行深度学习模型的开发和调优等。 总之,利用Python进行数据分析需要先导入数据集,然后使用Pandas和Numpy进行数据处理和转换,最后使用其他的数据分析库进行更深入的数据分析。Python提供了丰富的数据分析工具和库,可以满足各种需求。 ### 回答2: 利用Python进行数据分析有许多方法和技术,以下是一些常用数据分析工具和技巧。 首先,Python有很多强大的数据分析库,如NumPy、Pandas和Matplotlib。NumPy提供了高效的数值计算工具,可以进行向量化操作和高性能的数组处理。Pandas是一个用于数据结构和数据分析的库,可以方便地进行数据清洗、处理和操作。Matplotlib则是一个用于画图和可视化的库,可以将数据可视化为柱状图、散点图等。 其次,Python提供了很多统计学方法和技术,如描述统计、假设检验和回归分析等。使用Python进行描述统计可以计算数据的中心趋势和离散程度,如均值、中位数和标准差;使用假设检验可以检验数据之间是否存在显著差异;使用回归分析可以探索变量之间的关系和预测结果。 另外,Python还提供了机器学习算法和工具,如线性回归、决策树和聚类等。机器学习是一种通过训练数据来建立模型并进行预测的方法,可以用来解决分类、回归和聚类等问题。Python中的一些机器学习库如Scikit-learn和TensorFlow,提供了丰富的机器学习算法和工具,方便进行数据挖掘和预测分析。 最后,Python还有一些数据分析的框架和平台,如Jupyter Notebook和Anaconda。Jupyter Notebook是一个交互式的数据分析环境,可以通过代码、文字和图像组合成一个文档,方便数据分析的展示和共享。Anaconda是一个Python科学计算的发行版,集成了许多常用数据分析库和工具,方便安装和管理。 综上所述,利用Python进行数据分析可以通过强大的数据分析库、统计学方法和技术、机器学习算法和工具以及数据分析的框架和平台来实现。Python的简洁易学、丰富的库和工具生态系统,使其成为数据分析的首选语言之一。 ### 回答3: 利用Python进行数据分析有很多优点,首先Python是一种开源的编程语言,具有用户友好的语法和丰富的数据处理工具包,如NumPy、Pandas和Matplotlib等。这些工具使我们能够高效地处理和分析大量数据。 在进行数据分析时,首先需要加载数据集。Python提供了多种数据加载和处理方法,例如可以使用`pandas`库中的`read_csv()`函数加载CSV文件,或者使用`pandas`的`read_excel()`函数加载Excel文件。这样我们就可以在Python中轻松地获取数据集了。 一旦数据集被加载,我们就可以使用Python进行各种数据分析任务。例如,我们可以使用`pandas`库来清洗和处理数据,如删除重复数据、处理缺失值、拆分或组合列等。`pandas`还提供了各种统计函数,如求和、均值、中位数等,方便我们对数据集进行描述性统计分析。 除了`pandas`外,Python还有其他强大的数据分析库,如`NumPy`和`SciPy`,它们提供了许多数学和科学计算函数,可以用于进行数据预处理、聚类分析、回归分析等。 在数据分析中,可视化也是非常重要的一部分。Python的`Matplotlib`和`Seaborn`库提供了丰富的数据可视化工具,我们可以使用这些库来创建直方图、散点图、条形图等各种图表,以便更好地理解和展示数据。 总之,利用Python进行数据分析可以帮助我们更高效地处理和分析大量数据,并且通过可视化工具可以更好地展示分析结果。无论是学术研究还是商业决策,Python都是一个非常强大的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值