Pandas在数据分析中的应用

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

Pandas官网https://www.pypandas.cn/

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

  • 灵活的分组功能:group by数据分组、聚合、转换数据;

  • 直观地合并功能:merge数据连接;

  • 灵活地重塑功能:reshape数据重塑;

2a64b2ba70e7991fc406c224e67def2a.png

一、数据导入、导出

如何使用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()

2cfc1da6387c3cd2e906d55a90c1d37b.png

nrows导入前4行数据。

#导入前4行数据




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

9310d5c6ffd890ed602aa2dedd974791.png

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

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

bd701873664043b8f25286b897f4d540.png

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

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




df.head()

bdc9b21de0b39411b147e92044d806b7.png

index_col指定列作为行索引。

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

77a41a9d8fed91634f77c06806791362.png

usecols可以指定读取的列名。

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

cfe43b8026d063bd7e3938c07d2e268e.png

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

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

00442d14a59710b03b287b0c0f07f7f3.png

names对选取的列重命名。

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

4b7860356ae414478c901e0913e35c44.png

数据类型转化

types查看字段的数据类型。

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

f580386526fc0549222ff469289d8594.png

dtype转化数据类型。

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

9d6d602fd0e77b35fbfc69345b6a4a13.png

数据导出

使用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) #取消行索引

149718709a0a0d1e005b4ef360b73c58.png

加入行索引,并使用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')

a83ef7b12aea667dcb94ae8eeabc9301.png

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='空值')

0ebdab0c92b2083ceb79eb0ad515c4bc.png

导入.csv文件

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

d9f0114b23a3425223c73c7712e09988.png

编码方式设置

如果导出的文件为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()

7813e584499b4f11d9f0c6f275860f8b.png

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

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

构建数据表

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

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

d5684c7a66f7eab47fdab3cea07ea3a7.png

数据索引

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

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

3fe03ab8ae1a49c652a4290340c7b0c7.png

数据索引索引某行

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

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

b181840303659edb771443fdff509a94.png

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

0147fb4e21a05f77894ef4a08525c0b5.png

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

20dc976b2a2a7993c78f77bd3db0e42d.png

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

df16d5d56790d6f59f8905d7a5c66b5f.png

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

e75dce35a5b5db3ee92bc7c305fd5003.png

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

e7bee3673d9d42bdd1874bcdb5056623.png

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

fc6e4426cf0b627fca4c64e6e70f5b6f.png

条件筛选

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

d6ae332b6dd1e34792f41c4c2baad82a.png

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

674d168983d1955f164758268cc82b5c.png

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

b09c1fe4a0b2c79c1c086d7444e4d876.png

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

f962d09eea212eab49747b00e0026b0d.png

数值排序

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

053df451fb34753dc1a73fb96d7314a1.png

数据分类

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

841827747fe8512e390111facf83606d.png

三、数据预处理

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

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

2fd168b4d2578b788e651134073eadf2.png

重复值处理

首先对重复值计数。

df.duplicated().value_counts()

5e098e260fd16f57d852ba53a0539f9c.png

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

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

f117c7a8e00c0ae90c65d026067c161b.png

缺失值处理

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

df.head(11).isnull()

c6d8dad1486baf9ec7ab4f366ba1c0ee.png

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

df.info()

00761613026de4cca19cab45f5fe4406.png

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

df.isnull().any()

32820a2a69769c542fda2120ecc8fca3.png

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

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

b7803c5329db8ad9ae8cace4372a33c8.png

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

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

20d78168071c5ca8632fa7909febbf90.png

缺失值填充

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

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

43f3e5bf3f47f092934b0a303a6dbf73.png

limit用来限定填充的数量。

df1.fillna(0,limit=3)

c9d75971698fa74681d9095e14d46d9a.png

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

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

48dd579d85ab8ee5e8a7357876a3fea7.png

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

df1.fillna(method="ffill")

7d3702a34f10d770ac0f11f948b7156b.png

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

df1.fillna(df1.median())

0f73222946b8b7beb8d864e47d109355.png

interpolate表示线性插值。

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

a43e56ceb8633893ed9980c70848c00e.png

四、数据可视化

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

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

49cb727f7e3beee2b6aada4dad493b42.png

散点图

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

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


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

3319a3e54303ef850404315ab7856e3b.png

箱线图

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

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


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

9c3b61454339957c3313eb73b8e95887.png

折线图

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

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

bfab6c1794fb364f967cf6e2f90fcfe2.png

用箱形图的办法,超过了上四分位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()

65ba5796b032f8591ce34c0a94d637de.png

用标准差和均值,定义超过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()

27b4d3205222bd1a593023e865d795d9.png

正态分布图

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

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

8204d862b0c0137f3f2c3e080df3acab.png

END -

 
 
对比Excel系列图书累积销量达15w册,让你轻松掌握数据分析技能,可以在全网搜索书名进行了解:
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值