Python数据分析库-Pandas在数据分析中的知识点(二)
各位客官姥爷好,欢迎回来。上节我们总结了Pandas在数据分析应用过程的部分知识点,我们这节紧接着这些内容,再来看一些常见的用法。
01
向量运算
我们这边先新建一个Dataframe
import pandas as pddf = pd.DataFrame({"地区": ["A区","B区", "C区"], "前半年销量": [3500, 4500,3800], "后半年销量": [3000, 6000,5000], "单价": [10, 18, 15]})df
1. 向量的加法运算
有两种方式, 一种是利用add()函数: a.add(b) 表示a与b之和, 另一种是直接利用加法运算符号"+"。两种方式相等价。
#第一种方式: 利用add()函数 # df["总销量"] = df["前半年销量"].add(df["后半年销量"])#第二种方式: "+" df["总销量"] = df["前半年销量"] + df["后半年销量"] df
2. 向量减法运算
同样有两种方式: 一种是用sub()函数, A.sub(B)表示A-B, 另一种是采用减法运算符 "-"
#函数法: 注意A.sub(B)表示A-B df["销量增长"] = df["后半年销量"].sub(df["前半年销量"]) #运算符: "-" df["销量增长"] = df["后半年销量"] - df["前半年销量"] df
3. 向量的乘法运算
同样是两种方式: 一种是采用mul()函数: A.mul(B)表示: A与B之积, 另一种则是乘法运算符 "*"
#函数法: A.mul(B) df["前半年销售额"] = df["前半年销量"].mul(df["单价"]) #运算符: "*" df["后半年销售额"] = df["后半年销量"] * df["单价"] df
4. 向量的除法运算
同样是两种: 一种是采用div()函数: A.div(B)表示: A除以B, 第二种则是采用除法运算符"/"
#函数法 df["前半年销量1"] = df["前半年销量"].div(100) #运算符法 df["前半年销量2"] = df["前半年销量"] / 1000 df
5. 其他运算
1)取整和取余
#取整符号: "//" df["后半年销量1"] = df["后半年销量"] // 1000 #取余符号: "%" df["前半年销量1"] = df["前半年销量"] // 100 % 10 df
2)聚合运算
采用聚合函数对一组数据进行运算, 并返回单个值。比如最大值max()函数,最小值min()函数, 平均值mean()函数。需要注意的是聚合函数的特性:运算时会忽略缺失值。
#求前半年销量最大值df1 = df["前半年销量"].max()#求后半年销量最小值df2 = df["后半年销量"].min()#求单价的平均值df3 = df["单价"].mean()df1, df2 ,df3(4500, 3000, 14.333333333333334)
02
数据标准化
数据标准化有常用的几种方法:0-1标准化、z-score标准化、对数标准化、倒数标准化、比例标准化等。在这里主要对0-1标准化进行说明。
0-1标准化(也叫min-max标准化或离差标准化),是对原始数据进行线性变换,使其结果映射成[0,1]区间的值。
其计算公式为: 新值 = (当前值- 最小值) / (最大值 - 最小值)
import pandas as pd df = pd.DataFrame({"地区": ["A区","B区", "C区", "D区", "E区", "F区"], "销量": [3500, 4500,3800,3000, 6000,5000]}) #利用公式对原始数据进行0-1标准化处理 df["0-1"] = (df["销量"] - df["销量"].min()) / (df["销量"].max() - df["销量"].min()) df
03
数据分组
数据分组是根据研究需求,对原始数据按照某种标准划分为不同的组别,目的是观察数据的分布特征。
通常会在数据分组后再计算出各组中数据出现的的频数,最终形成频数分布表。
pandas中数据分组采用的函数是cut(x, bins, right = True, labels = None)函数:
第一个参数x指的是要分组的数据
第二个参数bins指的是划分标准, 也就是定义组的上限与下限
第三个参数right = True表示右边闭合, 左边不闭合; 当right = False时表示右边不闭合, 左边闭合, 默认为True.
第四个参数则是自定义分组的内容
import pandas as pddf = pd.DataFrame({"地区": ["A区","B区", "C区", "D区", "E区", "F区", "G区"], "单价": [ 8 , 20, 15, 7, 34, 25, 30]})#对单价进行编组: (5,15),(15,25),(25,35)bins = [5, 15, 25, 35]#利用cut()函数对单价进行分组, 并添加至原数据表中df["分组"] = pd.cut(df.单价, bins)df
自定义labels:
import pandas as pddf = pd.DataFrame({"地区": ["A区","B区", "C区", "D区", "E区", "F区", "G区"], "单价": [ 8 , 20, 15, 7, 34, 25, 30]})bins = [5, 15, 25, 35]#自定义labelslabels = ["15以下", "15到25", "25以上"]df["分组"] = pd.cut(df.单价, bins, labels = labels)df
04
字符转日期
在Pandas中字符类型转换成日期格式使用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表示秒
import pandas as pd df = pd.DataFrame({"name":["A","B","D"], "BirthDate": ["2011/10/20","2009/3/5","2010/5/6"]}) #转成日期格式 df["BD"] = pd.to_datetime(df.BirthDate,format = "%Y/%m/%d") df
#查看转化后的数据类型 df.dtypes
05
日期转字符
要将日期按照指定的格式输出成字符类型, 在Pandas里需要借助datetime模块中datetime类的strftime()方法实现。
strptime(date_string, format)方法中有两个参数, 第一个参数则是要转化的字符串, 第二个参数则为字符串中日期的格式
import pandas as pdfrom datetime import datetimedf = pd.DataFrame({"name":["A","B","D"], "BirthDate": ["2011/10/20","2009/3/5","2010/5/6"]})#转化为日期格式df["BD"] = df["BirthDate"].apply(lambda x: datetime.strptime(x, "%Y/%m/%d"))#日期格式化df["BD1"] = df["BD"].apply(lambda x: datetime.strftime(x, "%d-%m-%Y %H:%M:%S"))df
06
日期的提取
从日期格式中提取日期的部分内容, 比如提取年份, 月份等。
用法:转换为日期格式的列.dt.要提取的属性。
import pandas as pdfrom datetime import datetimedf = pd.DataFrame({"name":["A","B","D"], "BirthDate": ["2011/10/20","2009/3/5","2010/5/6"]})df["BD"] = df["BirthDate"].apply(lambda x: datetime.strptime(x, "%Y/%m/%d"))df["year"] = df["BD"].dt.yeardf["month"] = df["BD"].dt.monthdf["day"] = df["BD"].dt.daydf["hour"] = df["BD"].dt.hourdf["minute"] = df["BD"].dt.minutedf["second"] = df["BD"].dt.seconddf["weekday"] = df["BD"].dt.weekdaydf
07
数据记录的筛选
1. 关系运算符
用法:df[df.字段名 关系运算符 数值],比如筛选年龄大于30岁的记录。
import pandas as pddf = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28" ]})df_new = df["Surname_Age"].str.split("_", expand =True)df_new.columns = ["Surname","Age"]df_mer= pd.merge(df, df_new, left_index =True, right_index=True)df_mer.drop("Surname_Age", axis = 1, inplace =True)#将Age字段数据类型转化为整型df_mer["Age"] = df_mer["Age"].astype(int)#抽取Age中大于30的记录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表示不匹配缺失值.
import pandas as pd import numpy as np df = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28"],"SpouseAge":[np.NaN,"32",np.NaN]}) #匹配SpouseAge中包含2的记录 df[df.SpouseAge.str.contains("2",na = False)]
当na改为True时, 结果为:

5. 缺失值匹配:
用法:df[pd.isnull(df.字段名)]表示匹配该字段中有缺失值的记录。
import pandas as pd import numpy as np df = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28"],"SpouseAge":[np.NaN,"32",np.NaN]}) #匹配SpouseAge中有缺失值的记录 df[pd.isnull(df.SpouseAge)]
08
数据记录的合并
使用concat()函数可以将两个或者多个数据表的记录合并一起。
用法:pandas.concat([df1, df2, df3.....])
import pandas as pd df1 = pd.DataFrame({"ID": ["A10006","A10001"],"Salary": [12000, 20000]}) df2 = pd.DataFrame({"ID": ["A10008"], "Salary": [10000]}) #使用concat()函数将df1与df2的记录进行合并 pd.concat([df1, df2])
以上就是本次的分享,欢迎各位客官姥爷关注我,方便您第一次时间收到【干货】!
