今年参加了2023年全国大学生数学建模大赛,今年的C题,数据量极大,利用pandas,numpy进行数据处理以及分析极为方便,但对于编程方面的考验还是极大的,这次比赛给我感触极大,也让我明白自己学习pandas可能学习的也不是太好,在这些我将持续更新博客去复习pandas,numpy这些库,一方面为美赛做准备,一方面把我所学分享给大家。
1. 调用库
一般使用import语句来运行。
import pandas as pd
pandas内部存在两类数据类型,分别为Series以及DataFrame分别为一维以及二维表,一般数学建模用Series很少。本章简短介绍下,下面两种方式运行出来的结果都一样
t = pd.series([1,2,3],index=list("abc"))
temp_dic = {"a":1,"b":2,"c":3}
t2=pd.series(temp_dic)
2. pandas数据读取
在数学建模中使用最多的文件类型为xlsx与csv格式,可利用pandas读取表格类型文件,才可以进行后续分析,一般利用该方法读取后,类型为DataFrame类型。
csv、tsv、txt | pd.read_csv |
excel | pd.read_excel |
一般我比较喜欢在工程下保存附件,这样的话不需要设置路径,否则调用需要设计路径路径需要使用两种格式,反斜杠\需加载r转义,斜杠不需要。
df = pd.read_excel("附件1.xlsx")#读取附件1内容
df = pd.read_csv("附件1.csv")#读取附件1内容
在读取excel时可以用sheet_name=["a"]来读取a列
其中index_col能帮助我们设置列索引。在读取csv文件时候有时候为防止乱码会用到encoding="utf-8"。假设我仅仅需要用到old 与same两列,则我可以利用usecols=["old","same"]来提取两列。如果没有列索引可以利用下列方式来实现。
data = pd.read_csv("/Users/yequ/order_withoutColumns.csv", header=None,names=["订单号","用户id","支付金额","商品价格","购买数量","支付时间"])
特殊强调:今年附件2共84w行数据,可能有一部分人选择利用mysql去建立数据库处理,处理后的文件为sql格式,故在此补充一种可能用到的方法。具体方法可以看官方文档
df = pd.read_sql(sql_sentence,connection)
3. 数据保存
pandas提供了可以保存文件的方法,例如保存为csv,且不保存行索引标签
data.to_csv("/Users/yequ/电商数据清洗2.csv",index=false,encoding="utf-8-sig")
4. Series切片和索引
pandas可以通过位置或者索引来进行元素提取,可以取连续的或者不连续的。
t["a"]#取第一行
t[0]
t[:2]#取前两行
t[["a","b"]]
也可以条件搜索
t[t>3]#选取大于3的元素
同时可以取出索引,其类型为index型,可利用list对index型进行强制转化;也可以提取出值,类型为ndarray型。
t.index
type(t.index)#取类型
t.values
type(t.vlaues)#取类型 numpy.ndarray
5. DataFrame类型
5.1 介绍
DataFrame是在导入文件后,最经常遇到的类型,其为二维数据。
为了方便介绍,下面可以裸创建一个DataFrame去看操作,一般数模中导入就行。
pd.DataFrame(np.arrange(10).reshape(2,5))
'''
输出以结果
0 1 2 3 4
0 0 1 2 3 4
1 5 6 7 8 9
'''
可看到DataFrame提供了index(axis=0)与Columns(axis=1)分别提供行列索引。同时该方法中可以改变index与columns的索引量
pd.DataFrame(np.arange(12).reshape(4,3),index=list("abcd"),columns=list("XYZ"))
不难看到结果输出如左图所示
与上述相似,可以提取列索引与行索引通过index跟columns
5.2 整体情况查询
df.head(5)#默认显示前五行
df.tail(5)#显示后五行
pd.isnull(df["X"])#看X列是否存在空值,若存在输出索引
df.info()#相关信息概述
df.descirbe()#快速综合统计结果
拓展:可以利用以下方法来输出空值行,
t = df["age"]
is_null = pd.isnull(t)
t[is_null]
5.3 取行或取列
可利用pandas方便的提取行或列,方括号中写数字表示取行,写索引表示取列
df[:20]["ROW_name"]#取名为ROW_name的前20行
如果我想要取特定行列可以利用下列方式,iloc取数字,loc取标签。
df.loc(["A","B"],["X","Y"])#冒号在loc重视闭合的,会选中冒号后面的数据
df.iloc([1,2])
布尔索引:如果我想要取比如ROW列超过800的,同时内部可以使用&、| 等逻辑关系符
df[df["ROW"]>800]
5.4 缺失数据处理
上述已经说过如何确定当前是否缺失,同时也有notnull方法以下介绍两种方式去进行缺失值处理:
处理方式1:删除所在行或列
df.dropna(axis=0,how='any',inplace=False)
#axis=0为行
#how默认为any,还要有一个为NAN,就删除,选择all则为全部为NAN则删除
#inplace可以不用
处理方式2:填充
df.fillna(df.mean())#均值
df.fillna(df.median())#中位数
df.fillna(0)#0