龙空技术网

Python基础-——数据分析:Pandas知识点

佳运分享 198

前言:

如今咱们对“python位数补齐”大致比较关切,各位老铁们都想要学习一些“python位数补齐”的相关资讯。那么小编同时在网上搜集了一些有关“python位数补齐””的相关资讯,希望小伙伴们能喜欢,各位老铁们一起来学习一下吧!

本文主要是总结学习pandas过程中用到的函数和方法, 在此记录, 防止遗忘

1. 重复值的处理

利用drop_duplicates()函数删除数据表中重复多余的记录, 比如删除重复多余的ID.

1 import pandas as pd2 df = pd.DataFrame({"ID": ["A1000","A1001","A1002", "A1002"],3                  "departmentId": [60001,60001, 60001, 60001]})4 df.drop_duplicates()
2. 缺失值的处理

缺失值是数据中因缺少信息而造成的数据聚类, 分组, 截断等

2.1 缺失值产生的原因

主要原因可以分为两种: 人为原因和机械原因.

1) 人为原因: 由于人的主观失误造成数据的缺失, 比如数据录入人员的疏漏;

2) 机械原因: 由于机械故障导致的数据收集或者数据保存失败从而造成数据的缺失.

2.2 缺失值的处理方式

缺失值的处理方式通常有三种: 补齐缺失值, 删除缺失值, 删除缺失值, 保留缺失值.

1) 补齐缺失值: 使用计算出来的值去填充缺失值, 例如样本平均值.

使用fillna()函数对缺失值进行填充, 使用mean()函数计算样本平均值.

1 import pandas as pd2 import numpy as np3 df = pd.DataFrame({'ID':['A10001', 'A10002', 'A10003', 'A10004'], 4                    "Salary":[11560, np.NaN, 12988,12080]})5 #用Salary字段的样本均值填充缺失值6 df["Salary"] = df["Salary"].fillna(df["Salary"].mean())7 df

2) 删除缺失值: 当数据量大时且缺失值占比较小可选用删除缺失值的记录.

示例: 删除entrytime中缺失的值, 采用dropna函数对缺失值进行删除:

1 import pandas as pd2 df = pd.DataFrame({"ID": ["A1000","A1001","A1002"],3                  "entrytime": ["2015-05-06",pd.NaT,"2016-07-01" ]})4 df.dropna()

3) 保留缺失值.

3. 删除前后空格

使用strip()函数删除前后空格.

1 import pandas as pd2 df = pd.DataFrame({"ID": ["A1000","A1001","A1002"],3                  "Surname": [" Zhao ","Qian"," Sun " ]})4 df["Surname"] = df["Surname"].str.strip()5 df
4. 查看数据类型

查看所有列的数据类型使用dtypes, 查看单列使用dtype, 具体用法如下:

1 import pandas as pd2 df =  pd.DataFrame({"ID": [100000,100101,100201],"Surname": [" Zhao ","Qian"," Sun " ]})3 #查看所有列的数据类型4 df.dtypes5 #查看单列的数据类型6 df["ID"].dtype
5. 修改数据类型

使用astype()函数对数据类型进行修改, 用法如下

1 import pandas as pd2 df = pd.DataFrame({"ID": [100000,100101,100201],"Surname": [" Zhao ","Qian"," Sun " ]})3 #将ID列的类型转化为字符串的格式4 df["ID"].astype(str)
6. 字段的抽取

使用slice(start, end)函数可完成字段的抽取, 注意start是从0开始且不包含end. 比如抽取前两位slice(0, 2).

1 import pandas as pd2 df = pd.DataFrame({"ID": [100000,100101,100201],"Surname": [" Zhao ","Qian"," Sun " ]})3 #需要将ID列的类型转换为字符串, 否则无法使用slice()函数4 df["ID"]= df["ID"].astype(str)5 #抽取ID前两位6 df["ID"].str.slice(0,2)
7. 字段的拆分

使用split()函数进行字段的拆分, split(pat=None, n = -1, expand=True)函数包含三个参数:

第一个参数则是分隔的字符串, 默认是以空格分隔

第二个参数则是分隔符使用的次数, 默认分隔所有

第三个参数若是True, 则在不同的列展开, 否则以序列的形式显示.

1 import pandas as pd2 df = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28" ]})3 #对Surname_Age字段进行拆分4 df_new = df["Surname_Age"].str.split("_", expand =True)5 df_new
8. 字段的命名

有两种方式一种是使用rename()函数, 另一种是直接设置columns参数

1 import pandas as pd2 df = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28" ]})3 #第一种方法使用rename()函数4 # df_new = df["Surname_Age"].str.split("_", expand =True).rename(columns={0: "Surname", 1: "Age"})5 # df_new6 #第二种方法直接设置columns参数7 df_new = df["Surname_Age"].str.split("_", expand =True)8 df_new.columns = ["Surname","Age"]9 df_new

两种方式同样的结果:

9. 字段的合并

使用merge()函数对字段进行合并操作.

1 import pandas as pd2 df = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28" ]})3 df_new = df["Surname_Age"].str.split("_", expand =True)4 df_new.columns = ["Surname","Age"]5 #使用merge函数对两表的字段进行合并操作.6 pd.merge(df, df_new, left_index =True, right_index=True)
10. 字段的删除

利用drop()函数对字段进行删除.

1 import pandas as pd2 df = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28" ]})3 df_new = df["Surname_Age"].str.split("_", expand =True)4 df_new.columns = ["Surname","Age"]5 df_mer= pd.merge(df, df_new, left_index =True, right_index=True)6 #drop()删除字段,第一个参数指要删除的字段,axis=1表示字段所在列,inplace为True表示在当前表执行删除.7 df_mer.drop("Surname_Age", axis = 1, inplace =True)8 df_mer

删除Surname_Age字段成功:

11. 记录的抽取

1) 关系运算: df[df.字段名 关系运算符 数值], 比如抽取年龄大于30岁的记录.

 1 import pandas as pd 2 df = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28" ]}) 3 df_new = df["Surname_Age"].str.split("_", expand =True) 4 df_new.columns = ["Surname","Age"] 5 df_mer= pd.merge(df, df_new, left_index =True, right_index=True) 6 df_mer.drop("Surname_Age", axis = 1, inplace =True) 7 #将Age字段数据类型转化为整型 8 df_mer["Age"] = df_mer["Age"].astype(int) 9 #抽取Age中大于30的记录10 df_mer[df_mer.Age > 30]

2) 范围运算: df[df.字段名.between(s1, s2)], 注意既包含s1又包含s2, 比如抽取年龄大于等于23小于等于28的记录.

df_mer[df_mer.Age.between(23,28)]

3) 逻辑运算: 与(&) 或(|) 非(not)

比如上面的范围运算df_mer[df_mer.Age.between(23,28)]就等同于df_mer[(df_mer.Age >= 23) & (df_mer.Age <= 28)]

df_mer[(df_mer.Age >= 23 ) & (df_mer.Age <= 28)]

4) 字符匹配: df[df.字段名.str.contains("字符", case = True, na =False)] contains()函数中case=True表示区分大小写, 默认为True; na = False表示不匹配缺失值.

1 import pandas as pd2 import numpy as np3 df = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28"],"SpouseAge":[np.NaN,"32",np.NaN]})4 #匹配SpouseAge中包含2的记录5 df[df.SpouseAge.str.contains("2",na = False)]

当na改为True时, 结果为:

5) 缺失值匹配: df[pd.isnull(df.字段名)]表示匹配该字段中有缺失值的记录.

1 import pandas as pd2 import numpy as np3 df = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28"],"SpouseAge":[np.NaN,"32",np.NaN]})4 #匹配SpouseAge中有缺失值的记录5 df[pd.isnull(df.SpouseAge)]
12.记录的合并

使用concat()函数可以将两个或者多个数据表的记录合并一起, 用法: pandas.concat([df1, df2, df3.....])

1 import pandas as pd2 df1 = pd.DataFrame({"ID": ["A10006","A10001"],"Salary": [12000, 20000]})3 df2 = pd.DataFrame({"ID": ["A10008"], "Salary": [10000]})4 #使用concat()函数将df1与df2的记录进行合并5 pd.concat([df1, df2])

下面将是在知识点一的基础上继续总结.

13. 简单计算

新建一个数据表df

1 import pandas as pd2 3 df = pd.DataFrame({"地区": ["A区","B区", "C区"],4                    "前半年销量": [3500, 4500,3800],5                    "后半年销量": [3000, 6000,5000],6                    "单价": [10, 18, 15]})7 df
13.1 加法计算

有两种方式, 一种是利用add()函数: a.add(b) 表示a与b之和, 另一种是直接利用加法运算符号"+"

1 #第一种方式: 利用add()函数2 # df["总销量"] = df["前半年销量"].add(df["后半年销量"])3 #第二种方式: "+"4 df["总销量"] = df["前半年销量"] + df["后半年销量"]5 df

两者运算的结果都是相同的:

对于累加求和上述两种方法同样适用, 还有一种方式就是采用apply()函数, 参考文档:

这里介绍apply(func, axis = 0)函数的两个参数, apply()函数官方文档:

第一个参数func就是指用于每行或者每列的函数, 这里将采用lambda函数: 接收任意多个参数并返回单个计算结果.

第二个参数axis=0则表示计算行与行的数据, axis=1则表示计算列与列的数据

1 #由于地区不能参与运算, 因此在df1数据表中删除地区2 df1 = df.drop(["地区","单价"], axis = 1, inplace = False)3 #对df1数据表进行累加运算, 随后添加到df表中.4 df["总销量"] = df1.apply(lambda x: x.sum(), axis = 1)5 df
1 #删除地区和单价,分别计算前半年与后半年的三个地区总和.2 df2 = df.drop(["地区","单价"], axis = 1, inplace = False)3 #利用apply函数计算之后,添加至数据表中4 df.loc["Sum"] = df2.apply(lambda x: x.sum(), axis = 0 )5 df
13.2 减法运算

同样有两种方式: 一种是采用sub()函数, A.sub(B)表示A-B, 另一种是采用减法运算符 "-"

1 #函数法: 注意A.sub(B)表示A-B2 df["销量增长"] = df["后半年销量"].sub(df["前半年销量"])3 #运算符: "-"4 df["销量增长"] = df["后半年销量"] - df["前半年销量"] 5 df

两种方式, 同样的结果:

13.3 乘法运算

同样是两种方式: 一种是采用mul()函数: A.mul(B)表示: A与B之积, 另一种则是乘法运算符 "*"

1 #函数法: A.mul(B)2 df["前半年销售额"] = df["前半年销量"].mul(df["单价"])3 #运算符: "*"4 df["后半年销售额"] = df["后半年销量"] * df["单价"]5 df
13.4 除法运算

同样是两种: 一种是采用div()函数: A.div(B)表示: A除以B, 第二种则是采用除法运算符"/"

1 #函数法2 df["前半年销量1"] = df["前半年销量"].div(100)3 #运算符法4 df["前半年销量2"] = df["前半年销量"] / 10005 df

13.5 其他运算13.5.1 取整和取余

1 #取整符号: "//"2 df["后半年销量1"] = df["后半年销量"] // 10003 #取余符号: "%"4 df["前半年销量1"] = df["前半年销量"] // 100 % 105 df

13.5.2 聚合运算

采用聚合函数对一组数据进行运算, 并返回单个值, 比如最大值max()函数, 最小值min()函数, 平均值mean()函数

1 #求前半年销量最大值2 df1 = df["前半年销量"].max()3 #求后半年销量最小值4 df2 = df["后半年销量"].min()5 #求单价的平均值6 df3 = df["单价"].mean()7 df1, df2 ,df3
(4500, 3000, 14.333333333333334)
14. 0-1标准化

0-1标准化是对原始数据进行线性变换, 使其结果映射成[0,1]区间的值, 计算公式为: 新数据 = (原数据 - 最小值) / (最大值 - 最小值)

1 import pandas as pd2 df = pd.DataFrame({"地区": ["A区","B区", "C区", "D区", "E区", "F区"],3                    "销量": [3500, 4500,3800,3000, 6000,5000]})4 #利用公式对原始数据进行0-1标准化处理5 df["0-1"] = (df["销量"] - df["销量"].min()) / (df["销量"].max() - df["销量"].min())6 df
15. 数据分组

数据分组是根据统计研究的需求, 对原始数据按照某种标准划分为不同的组别. 主要目的是观察数据的分布特征. 在数据分组后再计算出各组中数据出现的的频数, 最终形成频数分布表.

pandas中数据分组采用的函数是cut(x, bins, right = True, labels = None)函数:

第一个参数x指的是要分组的数据

第二个参数bins指的是划分标准, 也就是定义组的上限与下限

第三个参数right = True表示右边闭合, 左边不闭合; 当right = False时表示右边不闭合, 左边闭合, 默认为True.

第四个参数则是自定义分组的内容

更多cut()函数相关参考官方文档:

1 import pandas as pd2 df = pd.DataFrame({"地区": ["A区","B区", "C区", "D区", "E区", "F区", "G区"],3                    "单价": [ 8 , 20, 15, 7, 34, 25, 30]})4 #对单价进行编组: (5,15),(15,25),(25,35)5 bins = [5, 15, 25, 35]6 #利用cut()函数对单价进行分组, 并添加至原数据表中7 df["分组"] = pd.cut(df.单价, bins)8 df

自定义labels:

1 import pandas as pd2 df = pd.DataFrame({"地区": ["A区","B区", "C区", "D区", "E区", "F区", "G区"],3                    "单价": [ 8 , 20, 15, 7, 34, 25, 30]})4 bins = [5, 15, 25, 35]5 #自定义labels6 labels = ["15以下", "15到25", "25以上"]7 df["分组"] = pd.cut(df.单价, bins, labels = labels)8 df

16. 日期转换

日期转换是指将字符类型转换成日期格式.

16.1 to_datetime方法

可使用to_datetime(arg, format = None)函数转换

第一个参数arg则是需要转化的字符串, 比如"2018/09/01"

第二个参数format则是原字符串中日期的格式, 比如"2018/09/01"的格式为 "%Y/%m/%d"

常用的格式有: %y表示两位数的年份, %Y表示四位数的年份, %m表示月份, %d表示月中的某一天, %H表示24小时制时数, %I表示12小时制时数, %M表示分钟, %S表示秒

to_datetime()函数官方文档:

1 import pandas as pd2 df = pd.DataFrame({"name":["A","B","D"],3                   "BirthDate": ["2011/10/20","2009/3/5","2010/5/6"]})4 #转成日期格式5 df["BD"] = pd.to_datetime(df.BirthDate,format = "%Y/%m/%d")6 df

1 #查看数据类型2 df.dtypes
16.2 datetime.strptime()方法

借助datetime模块中datetime类的strptime()方法, 将字符类型转化为日期格式.

strptime(date_string, format)方法中有两个参数, 第一个参数则是要转化的字符串, 第二个参数则为字符串中日期的格式

1 import pandas as pd2 from datetime import datetime3 df = pd.DataFrame({"name":["A","B","D"],4                   "BirthDate": ["2011/10/20","2009/3/5","2010/5/6"]})5 #转化为日期格式6 df["BD"] = df["BirthDate"].apply(lambda x: datetime.strptime(x, "%Y/%m/%d"))7 df
17. 日期格式化

日期格式化就是将日期按照指定的格式输出成字符类型, 这里借助datetime模块中datetime类的strftime()方法实现:

1 import pandas as pd2 from datetime import datetime3 df = pd.DataFrame({"name":["A","B","D"],4                   "BirthDate": ["2011/10/20","2009/3/5","2010/5/6"]})5 #转化为日期格式6 df["BD"] = df["BirthDate"].apply(lambda x: datetime.strptime(x, "%Y/%m/%d"))7 #日期格式化8 df["BD1"] = df["BD"].apply(lambda x: datetime.strftime(x, "%d-%m-%Y %H:%M:%S"))9 df
18.日期抽取

从日期格式中抽取日期的部分内容, 比如抽取年份, 月份等. 语法: 转换为日期格式的列.dt.要抽取的属性.

 1 import pandas as pd 2 from datetime import datetime 3 df = pd.DataFrame({"name":["A","B","D"], 4                   "BirthDate": ["2011/10/20","2009/3/5","2010/5/6"]}) 5 df["BD"] = df["BirthDate"].apply(lambda x: datetime.strptime(x, "%Y/%m/%d")) 6 df["year"] = df["BD"].dt.year 7 df["month"] = df["BD"].dt.month 8 df["day"] = df["BD"].dt.day 9 df["hour"] = df["BD"].dt.hour10 df["minute"] = df["BD"].dt.minute11 df["second"] = df["BD"].dt.second12 df["weekday"] = df["BD"].dt.weekday13 df

标签: #python位数补齐