经常要用“支付宝”帮人买东西,所以每月都有结账问题,支付宝可以导出csv文件,原来一直用EXCEL来处理,但也要花掉不少时间,稍不注意就会出错,在接触PANDAS以后,发现用PANDAS还是可以快不少,但支付宝交易记录里还是有不少看不见的垃圾,不处理掉会有非常多的麻烦,当然PANDAS有很多强大的功能,在这里将一一展示用到的功能:
首先支付宝交易记录基本上长这样:
在EXCEL表里
实际字符是这样:
支付宝交易记录明细查询
账号:[1234567890123]
起始日期:[2020-11-01 00:00:00] 终止日期:[2021-10-25 10:52:03]
---------------------------------交易记录明细列表------------------------------------
交易号 ,商家订单号 ,交易创建时间 ,付款时间 ,最近修改时间 ,交易来源地 ,类型 ,交易对方 ,商品名称 ,金额(元) ,收/支 ,交易状态 ,服务费(元) ,成功退款(元) ,备注 ,资金状态 ,
20211025200040011100800057038593 , ,2021-10-25 09:27:07 ,2021-10-25 09:27:13 ,2021-10-25 09:27:13 ,支付宝网站 ,即时到账交易 ,小张(张小宝) ,转账 ,0.01 ,支出 ,交易成功 ,0.00 ,0.00 ,转账 ,已支出 ,
2021102522001111111457461862 ,21102509220604186130 ,2021-10-25 09:22:06 ,2021-10-25 09:22:06 ,2021-10-25 09:22:06 ,其他(包括阿里巴巴和外部商家),即时到账交易 ,上海公共交通卡股份有限公司 ,上海公交-上海公交-2021-10-25 07:21:58,2.00 ,支出 ,交易成功 ,0.00 ,0.00 , ,已支出 ,
2021102522001111111457974809 ,39126600004823000003242110253170021402333 ,2021-10-25 08:48:20 ,2021-10-25 08:48:20 ,2021-10-25 08:48:20 ,其他(包括阿里巴巴和外部商家),即时到账交易 ,老鸿兴汤包馆 ,老鸿兴芷江路店 ,20.00 ,支出 ,交易成功 ,0.00 ,0.00 , ,已支出 ,
从上面的字符集里可以看到有很多不同长度的空格,这是数据处理时带来麻烦的东西,必须清除。
下面我们通过例子,来向各位展示各个步骤。
一. 读入支付宝交易记录csv文件
在这里我们有两个问题:a. 前面4行说明是个要绕过的障碍;b. 不是所有列对我们都有意义,我们只需要有选择的读入相应的列。
#准备工作
import pandas as pd
import re
from pandas import DataFrame
import numpy as np
#读入支付宝交易记录csv文件,header=4 ->从第5行开始读,一直读到底,usecols=[3,5,6,7,8,9,10,11,14,15] ->只读入这几列,可以根据需求调整,读入命令详细说明
df = pd.read_csv(alipay_file_name.csv, usecols=[3,5,6,7,8,9,10,11,14,15],header=4)
二. 清理交易记录中的空格
df.columns
先用上面这个命令看一下表头里的空格,见下图:
df_trimmed = df.rename(columns=lambda x: x.strip())
现在清理表头空格,然后表头就干净了,见下图:
用下面命令清理整个表的空格
df_trimmed = df.applymap(lambda x: x.strip() if isinstance(x, str) else x) # 清理整个表
支付宝交易记录csv文件最尾部还有说明,也必须删除,这也是一条经常用到的命令
df_trimmed.dropna(axis=0, how='all', inplace=True) # 删除行(行内字段都为空)
三. 对交易记录进行分组归类,用到一些比较高级的技术
a.
utilitybill = ['上海燃气有限公司','上海城投水务(集团)有限公司','中国电信股份有限公司上海分公司','国网上海市电力公司(缴费)'] #使用这个变量为了,更方便变量的修改,同时让下面的命令更简短
df_trimmed.loc[df_trimmed.交易对方.isin(utilitybill),['类型']]='水电煤话费' # isin函数,只要里面有一项完全匹配,就给相应的字段'类型'赋值:水电煤话费
在此涉及了不少概念:loc1,isin函数 2,条件赋值,(这些概念是为了方便在百度里查询)
在此借用了原来’类型’这列作为分组,通过不同的组合和赋值就可以实现分组。
b.
utilitybill2 = '出租汽车|嘀嗒出行|上海公共交通' #这是“包括”函数用的变量
df_trimmed.loc[df_trimmed['交易对方'].str.contains(utilitybill2),'类型']='交通费'
此处添加了str.contains函数3,这是非常强大的功能,下图是实际结果:
c.
df_trimmed.loc[((df_trimmed['类型'] == '即时到账交易') & (df_trimmed['金额(元)']>999.99 )) ,'类型']='大额交易'
这是个“和”条件的赋值, 类型= '即时到账交易’表示还没有被赋值过,同时金额(元)大于999.99,这里我们定义为大额交易。
在此可以把自己想要的分组归类都搞定,然后就是排序和输出存档。
四. 排序和输出
df_trimmed = df_trimmed.sort_values(by=["类型","交易对方","金额(元)"],ascending=[False,True,True]) # 三列排序,一列降序,二、三列升序
df_trimmed.to_excel('支付宝交易记录已处理.xlsx')
上面用到的很多命令已经是比较高级的
Pandas 可以是牛刀,也是瑞士军刀!