Python数据分析库-Pandas在数据分析中的知识点(二)
各位客官姥爷好,欢迎回来。上节我们总结了Pandas在数据分析应用过程的部分知识点,我们这节紧接着这些内容,再来看一些常见的用法。
01
向量运算
我们这边先新建一个Dataframe
import pandas as pd
df = 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 pd
df = 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 pd
df = pd.DataFrame({"地区": ["A区","B区", "C区", "D区", "E区", "F区", "G区"],
"单价": [ 8 , 20, 15, 7, 34, 25, 30]})
bins = [5, 15, 25, 35]
#自定义labels
labels = ["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 pd
from datetime import datetime
df = 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 pd
from datetime import datetime
df = 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.year
df["month"] = df["BD"].dt.month
df["day"] = df["BD"].dt.day
df["hour"] = df["BD"].dt.hour
df["minute"] = df["BD"].dt.minute
df["second"] = df["BD"].dt.second
df["weekday"] = df["BD"].dt.weekday
df
07
数据记录的筛选
1. 关系运算符
用法:df[df.字段名 关系运算符 数值],比如筛选年龄大于30岁的记录。
import pandas as pd
df = 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])
以上就是本次的分享,欢迎各位客官姥爷关注我,方便您第一次时间收到【干货】!