分享

pandas基础:使用Python pandas Groupby函数汇总数据,获得对数据更好地理解

 hercules028 2022-09-08 发布于四川

excelperfect

标签:PythonExcel, pandas

Python中,pandas groupby()函数提供了一种方便的方法,可以按照我们想要的任何方式汇总数据。实际上,groupby()函数不仅仅是汇总。我们将介绍一个如何使用该函数的实际应用程序,然后深入了解其后台的实际情况,即所谓的“拆分-应用-合并”过程。

跟踪信用卡消费的简单工具

现在几乎每个人都有信用卡,使用非常方便,只需轻触或轻扫即可完成交易。然而,在每个付款期结束时,你有没有想过“我到底把这些钱花在哪里了?”。因此,本文的目标是从我们的信用卡交易数据中,通过分析获得对数据的理解,从而了解一些关于我们自己消费的习惯,也许能制定一个行动计划来帮助改善我们的个人财务状况。

注:为方便演示,在知识星球完美Excel社群中有一个包含一份模拟的信用卡账单的示例文件cc_statement.csv

让我们看看有哪些数据可用。首先,将它加载到Python环境中。注意,在read_cvs行中,包含了一个parse_dates参数,以指示“Transaction Date”列是日期时间类型的数据,这将使以后的处理更容易。

import pandas as pd

df =pd.read_csv(r'D:\cc_statement.csv', parse_dates=['Transaction Date'])

如果我们现在不指定这个parse_dates参数,pandas可能会认为该列是文本数据。将文本转换为datetime类型的另一种方法是使用以下命令:

df['Transaction Date'] =pd.to_datetime(df['Transaction Date'])

下面的快速检查显示有533/交易,有交易日期、购买说明、购买类别和金额(debit借方指现金流出/我们的支出,credit贷方指现金流入/信用卡支付)。

图片

1

另外,在“Tansaction Date”列中使用descripe()函数表明我们正在处理2020年全年数据(min=2020-01-02max=2020-12-30)。datetime_is_numeric参数还可以帮助pandas理解我们使用的是datetime类型的数据。

图片

2

添加更多信息到我们的数据中

继续为我们的交易增加两列:天数和月份。因为已经指定“Transaction Date”列是一个类似datetime的对象,所以我们可以通过.dt访问器访问这些属性,该访问器允许向量化操作,即pandas处理数据的合适方式。

df['Day'] = df['TransactionDate'].dt.day_name()

df['Month'] = df['TransactionDate'].dt.month

day_name()返回日期的名称,例如周一到周日,而月份返回给定月份的数值(1-12)。

使用groupby汇总数据

无组织的交易数据不会提供太多价值,但当我们以有意义的方式组织和汇总它们时,可以对我们的消费习惯有更多的了解。看看下面的例子。

在下面的示例中,我们首先按星期几对数据进行分组,然后指定要查看的列——“Debit(借方)”,最后对分组数据的“Debit”列执行操作:计数或求和。下面的总结告诉我们,在星期五购物最多(按交易数量计算),而在星期天花费最多(以美元计)。

图片

3

实际上,我们可以使用groupby对象的.agg()方法将上述两行代码组合成一行,只需将字典传递到agg()。字典键是我们要处理的数据列,字典值(可以是单个值或列表)是我们要执行的操作。

图片

4

图片

5

使用字典方式,除非使用rename()方法,否则无法更改列名。要更改agg()方法中的列名,我们需要执行以下操作:

  • 关键字是新的列名

  • 这些值是命名元组 pd.namedagh,第一个参数用于列,第二个参数用于指定操作

图片

6

pd.NamedAgg是一个名称元组,也允许使用正则元组,因此我们可以进一步简化上述内容:

图片

7

按多列分组

记住,我们的目标是希望从我们的支出数据中获得一些见解,并尝试改善个人财务状况。“Fee手续费/Interest利息费”类别看起来可疑,也想看看是否可以减少一些“Entertainment娱乐”费用,所以我们将这些费用分解为每月的数字。

我们将仅从类别中选择“Entertainment”和“Fee/Interest Charge”,并检查新数据集。

图片

8

似乎我们几乎每个月都要支付“Fee手续费/Interest利息费”,这是一个明显的危险信号,也是一个不良的消费习惯,也许我们没有及时偿还信用卡,导致了这些利息费。我们应该更加关注付款期限,更加努力按时付款。

现在,你已经基本了解了如何使用pandas groupby函数汇总数据。下面讨论当使用该函数时,后台是怎么运作的。

Pandas groupby:拆分-应用-合并的过程

本质上,groupby指的是涉及以下一个或多个步骤的流程:

  • Split拆分:将数据拆分为组

  • Apply应用:将操作单独应用于每个组(从拆分步骤开始)

  • Combine合并:将结果合并在一起

Split数据集

拆分数据发生在groupby()阶段。按支出类别拆分数据,结果实际上是一个DataFrameGroupBy对象。如果只是将其打印出来,则很难想象该对象是什么:

图片

9

好消息是,我们可以迭代GroupBy对象来查看其中的内容。完整的输出太长,所以这里只显示其中一些:

图片

10

注意到这个项目周围的括号了吗?它看起来像一个包含文本和数据框架的元组……让我们通过打印GroupBy对象中每个项目的类型来确认这一点。

图片

11

现在我们已经确认了!GroupBy对象包含一组元组(每组一个)。在元组中,第一个元素是类别名称,第二个元素是属于特定类别的子集数据。因此,这是拆分步骤。

我们也可以使用内置属性或方法访问拆分的数据集,而不是对其进行迭代。例如,属性groups为我们提供了一个字典,其中包含属于给定组的行的组名(字典键)和索引位置。

图片

12

要获得特定的组,简单地使用get_group()

图片

13

应用操作

一旦有了拆分数据集,就可以轻松地对数据子集应用操作。要计算“Fee/Interest Charge”组的总开支,可以简单地将“Debit”列相加。

图片

14

可能还注意到,我们可以使用.loc方法获得与上面的groupby方法完全相同的结果。然而,.loc方法一次只执行一个操作,而groupby方法自动对每个组应用相同的操作。

图片

15

如果我们要使用.loc方法复制split&apply过程,如下所示。我们还将.locgroupby方法进行了比较。很明显,后者肯定更易于使用,并且还将结果放回数据框架结构中,这对于进一步处理更为方便。

图片

16

图片

17

合并结果

最后,合并步骤很容易从我们上面获得的结果中可视化,它基本上将结果放回数据框架中,并以更有意义的方式显示,就像图17中的结果一样。

注:本文学习整理自pythoninoffice.com

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多