excelperfect 标签:Python与Excel, 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-02,max=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()方法中的列名,我们需要执行以下操作:
图6 pd.NamedAgg是一个名称元组,也允许使用正则元组,因此我们可以进一步简化上述内容: 图7 按多列分组 记住,我们的目标是希望从我们的支出数据中获得一些见解,并尝试改善个人财务状况。“Fee手续费/Interest利息费”类别看起来可疑,也想看看是否可以减少一些“Entertainment娱乐”费用,所以我们将这些费用分解为每月的数字。 我们将仅从类别中选择“Entertainment”和“Fee/Interest Charge”,并检查新数据集。 图8 似乎我们几乎每个月都要支付“Fee手续费/Interest利息费”,这是一个明显的危险信号,也是一个不良的消费习惯,也许我们没有及时偿还信用卡,导致了这些利息费。我们应该更加关注付款期限,更加努力按时付款。 现在,你已经基本了解了如何使用pandas groupby函数汇总数据。下面讨论当使用该函数时,后台是怎么运作的。 Pandas groupby:拆分-应用-合并的过程 本质上,groupby指的是涉及以下一个或多个步骤的流程:
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过程,如下所示。我们还将.loc与groupby方法进行了比较。很明显,后者肯定更易于使用,并且还将结果放回数据框架结构中,这对于进一步处理更为方便。 图16 图17 合并结果 最后,合并步骤很容易从我们上面获得的结果中可视化,它基本上将结果放回数据框架中,并以更有意义的方式显示,就像图17中的结果一样。 注:本文学习整理自pythoninoffice.com。
|
|
来自: hercules028 > 《excel》