Pandas在数据分析中的应用

x33g5p2x  于2022-03-05 转载在 其他  
字(7.1k)|赞(0)|评价(0)|浏览(297)

写在文章的最前面,Python办公自动化有什么用?使用Python代码脚本取代繁复的手工操作,自动化流程化处理数据。本文借助Python中的Pandas库进行数据导入,关于如何学习Pandas,我们可以在其官方文档进行学习,官网的地址如下。
Pandas官网https://www.pypandas.cn/

总结来说,使用pandas可以做数据整理与清洗数据分析与建模数据可视化与制表等。

  • 灵活的分组功能:group by数据分组、聚合、转换数据;
  • 直观地合并功能:merge数据连接;
  • 灵活地重塑功能:reshape数据重塑;

一、数据导入、导出

如何使用Python导入.xlsx文件和.csv文件,导入.xlsx文件的参数如下所示,本文讲解我们日常办公所需要的一些参数。

pd.read_excel(io, sheet_name=0, header=0, names=None, index_col=None,
              usecols=None, squeeze=False,dtype=None,engine=None,
              converters=None,true_values=None,false_values=None,skiprows=None,
              nrows=None,na_values=None,parse_dates=False,date_parser=None,
              thousands=None, comment=None, skipfooter=0, convert_float=True, **kwds)

导入.xlsx文件

使用read_excel命令导入数据,写入路径即可导入数据。

#导入数据
df = pd.read_excel(r"C:\Users\尚天强\Desktop\film_score.xlsx")
df.head()

nrows导入前4行数据。

#导入前4行数据



df = pd.read_excel(r"C:\Users\尚天强\Desktop\film_score.xlsx",nrows=4)
df

sheet_name指定导入的sheet表,在首映地点中选择中国首映的sheet表。

#导入具体的sheet数据
df = pd.read_excel(r"C:\Users\尚天强\Desktop\film_score.xlsx",sheet_name = "中国首映")
df.head()

header指定第一行是否为列名,header=0,表示数据第一行为列名,header=None,表明数据没有列名。

#header为0时,第一行作为列索引
df = pd.read_excel(r"C:\Users\尚天强\Desktop\film_score.xlsx",header = 0)



df.head()

index_col指定列作为行索引。

#index_col为1时,第二列作为行索引
df = pd.read_excel(r"C:\Users\尚天强\Desktop\film_score.xlsx",index_col = 1)
df.head()

usecols可以指定读取的列名。

#选择第二列,第六列数据
df = pd.read_excel(r"C:\Users\尚天强\Desktop\film_score.xlsx",usecols =[1,5])
df.head()

skiprows跳过多少行再读取数据。

#跳过第二行和第四行数据
df = pd.read_excel(r"C:\Users\尚天强\Desktop\film_score.xlsx",header=0,skiprows=[1,3])
df.head()

names对选取的列重命名。

#对列命名
df = pd.read_excel(r"C:\Users\尚天强\Desktop\film_score.xlsx",usecols =[1,5],names=["电影名称","上映日期"])
df.head()

数据类型转化

types查看字段的数据类型。

df = pd.read_excel(r"C:\Users\尚天强\Desktop\film_score.xlsx")
df.dtypes

dtype转化数据类型。

#转化数据类型
df = pd.read_excel(r"C:\Users\尚天强\Desktop\film_score.xlsx",dtype={'投票人数':'int','评分':'int'})
df.dtypes

数据导出

使用to_excel,写入导出的路径,进行数据导出,index=False消行索引。

import pandas as pd
a={'销量':[10,20],'售价':[100,200]}
df=pd.DataFrame(a)
df.to_excel(r'C:\Users\尚天强\Desktop\learn.xlsx',index=False) #取消行索引

加入行索引,并使用index.name对其命名。

import pandas as pd
a={'销量':[10,20],'售价':[100,200]}
df=pd.DataFrame(a,index=['A','B']) #加入一个行索引
df.index.name='货号'
df.to_excel(r'C:\Users\尚天强\Desktop\learn.xlsx')

float_format设置浮点型数据的小数位,na_rep空值进行填充。

import pandas as pd
a={'销量':[10,20.43],'售价':[100.25,None]}
df=pd.DataFrame(a,index=['A','B']) #加入一个行索引
df.index.name='货号'
df.to_excel(r'C:\Users\尚天强\Desktop\learn.xlsx',sheet_name='第一张表',float_format='%.2f',na_rep='空值')

导入.csv文件

我们常使用的CSV文件有CSV UTF-8(逗号分隔)和CSV(逗号分隔)这两种。

编码方式设置

如果导出的文件为gbk编码方式,导入数据的时候用gbk的编码方式。encoding指定数据读入的编码方式。

# 如果导出的文件为gbk编码方式,导入数据的时候用gbk 
df = pd.read_csv(r"C:\Users\尚天强\Desktop\score.csv",encoding="gbk",nrows =2)#导入前两行 
df

中文路径导入数据

当文件路径或文件名为中文时,如果是CSV UTF-8(逗号分隔)的格式文件,需要把编码格式更改为utf-8-sig,如果是CSV(逗号分隔)的格式文件,需要把编码格式更改为gbk。

当文件路径或文件名为中文时,如果是CSV UTF-8(逗号分隔)的格式文件,需要把编码格式更改为utf-8-sig

如果是CSV(逗号分隔)的格式文件,需要把编码格式更改为gbk 。

df = pd.read_csv(r'C:\Users\尚天强\Desktop\cars_scoreCSV.csv',engine="python",encoding="gbk")
df.head()

当文件路径或文件名为中文时,如果是CSV UTF-8(逗号分隔)的格式文件,需要把编码格式更改为utf-8-sig,如果是CSV(逗号分隔)的格式文件,需要把编码格式更改为gbk 。

df = pd.read_csv(r'C:\Users\尚天强\Desktop\cars_scoreUTF-8.csv',engine="python",encoding="utf-8-sig") 
df.head()

二、数据字段、数据值筛选

一张表会包含很多字段,造成数据冗余,在做数据分析时,我们仅需要提取数据分析所需要的字段,这里就需要用到数据选取的知识点。本文构建数据表做数据索引,然后对数据内容进行调整,包含修改数据类型、去除空格、数据替换、截取字符等,最后做数据规整。

构建数据表

首先导入常用的库,设置一些数据字段,构建一张数据表。

import pandas as pd
import numpy as np
import datetime

df = pd.DataFrame({'用户ID':[1001,1002,1003,1004,1005,1006],
                  '日期':pd.date_range(datetime.datetime(2021,3,23),periods=6),
                  '城市':['北京', '上海', '广州', '上海', '杭州', '北京'],
                  '年龄':[23,44,54,32,34,32],
                  '性别':['F','M','M','F','F','F'],
                  '成交量':[3200,1356,2133,6733,2980,3452]},
                   columns =['用户ID','日期','城市','年龄','性别','成交量'])
df

数据索引

将数据索引进行修改,赋值一个列表。

#修改索引,直接赋值给Index即可
df.index=list('abcdef')
df

数据索引索引某行

有三种方法,一种是loc按照名字索引,另一种是iloc按照下标索引,Ix是loc和iloc的混合,既能按索引标签提取,也能按位置进行数据提取。

#索引两列
df.loc[:,['城市','成交量']]

#索引前两行,两列
df.loc[['a','b'],['城市','成交量']]

#获取第一列、第二列数据
df.iloc[:,0:2]

#获取第二行、第三行,第一、二、三列的数据
df.iloc[[1, 2],[0, 1, 2]]

# 仅取出第1行的数据
df.iloc[0]

#索引全部行数据
df.iloc[:,[0, 1, 2]]

#使用ix按索引标签和位置混合提取数据
df.ix[:'2021-03-26',:3]

条件筛选

#筛选性别为F的数据
df[df['性别']=='F']

df[(df['城市']=='北京') & (df['年龄']>30)]

#布尔索引加普通索引选择指定的行和列
df[df['年龄']>30][['用户ID','城市','成交量']]

#切片索引加普通索引选择指定的行和列
df.iloc[0:3][['用户ID','城市','成交量']]

数值排序

#排序,以成交量降序排列
df.sort_values(['成交量'],ascending=False)

数据分类

#使用where进行判断,条件满足为第一个值,不满足则返回第二个值
df['达成情况']=np.where(df['成交量']>3000,'达成量高','达成量低')
df

三、数据预处理

数据分析时,首先应对数据进行清洗,这里将数据清洗分为重复值处理、缺失值处理、异常值处理三个部分,重复值处理可删除重复的字段,缺失值处理可以用线性插值、填充为0或用均值填充等,异常值处理用描述性分析、散点图、箱形图、直方图查找异常并处理。本文使用超市商品交易数据,详细介绍重复值处理、缺失值处理、异常值处理的方法,并实际运用数据进行演示,代码操作如下所示。

#导入数据
import pandas as pd
df=pd.read_csv(r"C:\Users\尚天强\Desktop\超市商品交易.csv",engine="python",encoding="utf-8-sig")
df.head()

重复值处理

首先对重复值计数。

df.duplicated().value_counts()

用drop_duplicates的方法对某几列下面的重复行删除,subset:以某列作为基准列,判断是否重复;keep: 保留哪个字段,fisrt参数保留首次出现的数值;inplace: 是否替换当前数据,True选择替换当前数据。

df.drop_duplicates(subset=["商品码"],keep='first',inplace=True)
df.duplicated().value_counts()

缺失值处理

通过isnull函数看一下是否有空值,结果是有空值的地方显示为True,没有的显示为False。

df.head(11).isnull()

使用info查看各个字段的属性,标记的部分为缺失的部分。

df.info()

通过isnull().any()查看每一列是否有空值,True返回缺失值。

df.isnull().any()

用df.isnull().values==True来定位哪几行是有空值的。

df[df.isnull().values==True]

how='any'只要有一个缺失值就删除,axis=0,删除的是行,默认删除的是行,inplace=True替换原始数据。

df.dropna(how='any', axis=0,inplace=True)
df.info()

缺失值填充

fillna(0)用0对缺失值进行填充。

df1=df[df.isnull().values==True]
df1.fillna(0)

limit用来限定填充的数量。

df1.fillna(0,limit=3)

{ }对不同的列填充不同的值,其中键作为列,值作为缺失值填充的值。

df1.fillna({"售价":0 ,"成交价":0 ,"进价": "#N/A"})

method方法使用ffill,表示用前一个值作为填充的值。

df1.fillna(method="ffill")

median方法使用中位数的值进行填充。

df1.fillna(df1.median())

interpolate表示线性插值。

df[df.isnull().values==True].interpolate() #线性插值

四、数据可视化

对于一些异常值的处理,可以使用散点图和箱线图进行数据标记,describe( )对统计字段进行描述性分析,从平均值、标准差,看数据的波动情况,最大值查看数据的极值。

df[['售价','进价']].describe()

散点图

做出散点图,查看数据中异常的点,图中标记的点就是异常的点。

from matplotlib import pyplot as plt
plt.rcParams["font.sans-serif"]='SimHei' #解决中文乱码问题

plt.scatter(df["售价"], df["进价"])
plt.title("散点图",loc = "center")
plt.show()

箱线图

做出箱线图,反映原始数据分布的特征。

plt.subplot(1,2,1)
plt.boxplot(df["数量"],labels = ["数量"])

plt.subplot(1,2,2)
plt.boxplot(df["售价金额"],labels = ["售价金额"])
plt.show()

折线图

做售价金额的折线图,售价金额呈波动趋势。

plt.plot(df["售价金额"])

用箱形图的办法,超过了上四分位1.5倍四分位距或下四分位1.5倍距离都算异常值,用中位数填充。

import numpy as np
a = df["售价金额"].quantile(0.75)
b = df["售价金额"].quantile(0.25)
c = df["售价金额"]

c[(c>=(a-b)*1.5+a)|(c<=b-(a-b)*1.5)]=np.nan
c.fillna(c.median(),inplace=True)
c.describe()

用标准差和均值,定义超过4倍就算异常值,同样用中位数填充。

a = df["售价金额"].mean()+df["售价金额"].std()*4
b = df["售价金额"].mean()-df["售价金额"].std()*4
c = df["售价金额"]
c[(c>=a)|(c<=b)]=np.nan
c.fillna(c.median(),inplace=True)
c.describe()

正态分布图

正态性检验,发现售价金额呈右偏分布,表明售价金额并不是正态分布。

import seaborn as sns
sns.distplot(df['售价金额'])
#解决负号无法正常显示问题
plt.rcParams["axes.unicode_minus"]= False
plt.show()

END -

对比Excel系列图书累积销量达15w册,让你轻松掌握数据分析技能,可以在全网搜索书名进行了解:

相关文章

微信公众号

最新文章

更多