上篇分享了数据分析用到的一个库:Numpy 库,今天分享一个比 Numpy 更高效的库:pandas,它可以对数据进行导入、清洗、处理、统计和输出。pandas 是基于 Numpy 库的,可以说,pandas 库就是为数据分析而生的。

环境

语言:Python 3.6

安装&导入

用 pip 命令快速安装 pandas 库。

Python

pip install pandas

1

pip install pandas

安装完后再编辑器中导入。

Python

import pandas as pd

1

import pandas as pd

读取文件

读取你的 excel 文件,并另存为 csv 格式的文件。

Python
import pandas as pd
from pandas import DataFrame, Series
df = DataFrame(pd.read_excel('test.xlsx'))
df.to_csv('test1.csv')
print(df)


importpandasaspd
frompandasimportDataFrame,Series
df=DataFrame(pd.read_excel('test.xlsx'))
df.to_csv('test1.csv')
print(df)

读取过程中可能会报错,提示你缺少 xlrd 模块的情况,用 pip 命令安装即可。

打印出读取到的数据,我们发现,文件中单元格为空的数据以 NAN 代替了。

当然,也可以直接读取文件并打印,不给参数的话默认只打印前 5 行数据。以我之前爬取的热门歌手文件为例。

Python
import pandas as pd
from pandas import DataFrame, Series
df = DataFrame(pd.read_excel('歌手.xlsx'))
print(df.head(8))


importpandasaspd
frompandasimportDataFrame,Series
df=DataFrame(pd.read_excel('歌手.xlsx'))
print(df.head(8))

打印结果如下:

Python

歌手名字 歌手ID

0 周杰伦 6452

1 陈奕迅 2116

2 薛之谦 5781

3 林俊杰 3684

4 李荣浩 4292

5 张学友 6460

6 杨宗纬 6066

7 许巍 5770


歌手名字歌手ID

0周杰伦6452

1陈奕迅2116

2薛之谦5781

3林俊杰3684

4李荣浩4292

5张学友6460

6杨宗纬6066

7许巍5770

清洗数据

我们知道,从事数据分析工作的,80% 的时间都花在数据清洗上面,因为我们从各个渠道获取的信息格式不统一,我们需要对他们进行清洗。

清洗数据主要内容如下:

删除 DataFrame 中的不必要列和行。

重命名 columns 为一组更易识别的标签。

更改数据格式。

去除数据间空格或者特定字符。

去除重复的行。

查找空值。

删除行或者列

我们还是以刚才歌手信息为例,为了看删除效果,我加了一列信息:性别,下面只显示部分信息。

Python

歌手名字 歌手ID 性别

0 周杰伦 6452 男

1 陈奕迅 2116 男

2 薛之谦 5781 男

3 林俊杰 3684 男

4 李荣浩 4292 男

5 张学友 6460 男

6 杨宗纬 6066 男

7 许巍 5770 男


歌手名字歌手ID性别

0周杰伦6452男

1陈奕迅2116男

2薛之谦5781男

3林俊杰3684男

4李荣浩4292男

5张学友6460男

6杨宗纬6066男

7许巍5770男

删除性别这一列。

Python
import pandas as pd
from pandas import DataFrame, Series
df = DataFrame(pd.read_excel('歌手.xlsx'))
df1 = df.drop(columns=['性别'])
print(df1)


importpandasaspd
frompandasimportDataFrame,Series
df=DataFrame(pd.read_excel('歌手.xlsx'))
df1=df.drop(columns=['性别'])
print(df1)

执行后发现刚加的「性别」这一列已被删除。

删除某一行,比如删除李荣浩这一行信息,我们通过上面可以知道这一行的 index 是 4。

Python
import pandas as pd
from pandas import DataFrame, Series
df = DataFrame(pd.read_excel('歌手.xlsx'))
df1 = df.drop(index=['李荣浩'])
print(df1)


importpandasaspd
frompandasimportDataFrame,Series
df=DataFrame(pd.read_excel('歌手.xlsx'))
df1=df.drop(index=['李荣浩'])
print(df1)

执行后结果如下,我们发现,index 为 4 的这一行信息已被删除。

Python

歌手名字 歌手ID 性别

0 周杰伦 6452 男

1 陈奕迅 2116 男

2 薛之谦 5781 男

3 林俊杰 3684 男

5 张学友 6460 男

6 杨宗纬 6066 男

7 许巍 5770 男


歌手名字歌手ID性别

0周杰伦6452男

1陈奕迅2116男

2薛之谦5781男

3林俊杰3684男

5张学友6460男

6杨宗纬6066男

7许巍5770男

重命名列名

用 rename 方法将列名修改成自己需要的列名,比如歌手名字换成 SName。

Python
import pandas as pd
from pandas import DataFrame, Series
df = DataFrame(pd.read_excel('歌手.xlsx'))
df.rename(columns={'歌手名字': 'SName'}, inplace=True)
print(df)


importpandasaspd
frompandasimportDataFrame,Series
df=DataFrame(pd.read_excel('歌手.xlsx'))
df.rename(columns={'歌手名字':'SName'},inplace=True)
print(df)

更改数据格式

用 astype 更改数据格式。

Python

df = DataFrame(pd.read_excel('歌手.xlsx'))

df1 = df['歌手ID'].astype('str')

1

2

df=DataFrame(pd.read_excel('歌手.xlsx'))

df1=df['歌手ID'].astype('str')

删除数据间空格

Python

df = DataFrame(pd.read_excel('歌手.xlsx'))

df['歌手名字'] = df['歌手名字'].map(str.strip) # 删除左右两边空格

df['歌手名字'] = df['歌手名字'].map(str.lstrip) # 删除左边空格

df['歌手名字'] = df['歌手名字'].map(str.rstrip) # 删除右边空格


df=DataFrame(pd.read_excel('歌手.xlsx'))

df['歌手名字']=df['歌手名字'].map(str.strip)# 删除左右两边空格

df['歌手名字']=df['歌手名字'].map(str.lstrip)# 删除左边空格

df['歌手名字']=df['歌手名字'].map(str.rstrip)# 删除右边空格

去除重复的行

用自带的方法一行代码可以搞定。

Python

df = DataFrame(pd.read_excel('歌手.xlsx'))

df = df.drop_duplicates()


df=DataFrame(pd.read_excel('歌手.xlsx'))

df=df.drop_duplicates()

查找空值

我们可以用 isnull 方法查找数据中的空值或者 NAN,返回的是 Boolean 类型,False 表示不是空值,True 表示空值。

Python

df = DataFrame(pd.read_excel('歌手.xlsx'))

df = df.isnull()

print(df)


df=DataFrame(pd.read_excel('歌手.xlsx'))

df=df.isnull()

print(df)

为了展示效果,我执行前去掉了第 5 行的信息,所以第 5 行出现一个 True。

Python

歌手名字 歌手ID

0 False False
1 False False
2 False False
3 False False
4 True False


歌手名字歌手ID

0FalseFalse

1FalseFalse

2FalseFalse

3FalseFalse

4TrueFalse

数据统计

上周讲 Numpy 库时也讲到了对数据的统计,计算数据最大值、最小值、平均值、方差、标准差等。pandas 也可以做这些工作,而且 pandas 中的 describe 可以直接显示这个数据。

我们先创建一个科目成绩的数据。

Python

df = DataFrame({'subject': ['语', '数', '外', '理', '化'], 'data': range(90, 95)})

print(df)

1

2

df=DataFrame({'subject':['语','数','外','理','化'],'data':range(90,95)})

print(df)

数据如下:

Python

subject data

0 语 90

1 数 91

2 外 92

3 理 93

4 化 94


subjectdata

0语90

1数91

2外92

3理93

4化94

我们用 describe 方法直接显示这些统计数据。

Python

df = DataFrame({'subject': ['语', '数', '外', '理', '化'], 'data': range(90, 95)})

print(df.describe())


df=DataFrame({'subject':['语','数','外','理','化'],'data':range(90,95)})

print(df.describe())

结果如下:

Python
data
count 5.000000
mean 92.000000
std 1.581139
min 90.000000
25% 91.000000
50% 92.000000
75% 93.000000
max 94.000000


data
count5.000000
mean92.000000
std1.581139
min90.000000
25%91.000000
50%92.000000
75%93.000000
max94.000000

多表合并

如果我们有多个数据表,我们需要对他进行合并处理。以下这些知识点和 SQL 很相似,如果你对 SQL 语句熟悉的话,以下很容易理解

对相同的列进行合并

Python
df1 = DataFrame({'subject': ['语', '数', '外', '理', '化'], 'data': range(90, 95)})
df2 = DataFrame({'subject': ['语', '数', '外', '史', '地'], 'data': range(90, 95)})
df3 = pd.merge(df1, df2, on='subject')
print(df3)


df1=DataFrame({'subject':['语','数','外','理','化'],'data':range(90,95)})
df2=DataFrame({'subject':['语','数','外','史','地'],'data':range(90,95)})
df3=pd.merge(df1,df2,on='subject')
print(df3)

两个表中,语数外是相同的,进行合并,结果如下:

Python

subject data_x data_y

0 语 90 90

1 数 91 91

2 外 92 92


subjectdata_xdata_y

0语9090

1数9191

2外9292

内连接

也就是两个数据表中的交集部分。

Python
df1 = DataFrame({'subject': ['语', '数', '外', '理', '化'], 'data': range(90, 95)})
df2 = DataFrame({'subject': ['语', '数', '外', '史', '地'], 'data': range(90, 95)})
df3 = pd.merge(df1, df2, how='inner')
print(df3)


df1=DataFrame({'subject':['语','数','外','理','化'],'data':range(90,95)})
df2=DataFrame({'subject':['语','数','外','史','地'],'data':range(90,95)})
df3=pd.merge(df1,df2,how='inner')
print(df3)

结果显示两个表中相同的数据。

Python

subject data

0 语 90

1 数 91

2 外 92


subjectdata

0语90

1数91

2外92

左连接

以左表为主,右表只显示交集部分的数据。

Python
df1 = DataFrame({'subject': ['语', '数', '外', '理', '化'], 'data': range(90, 95)})
df2 = DataFrame({'subject': ['语', '数', '外', '史', '地'], 'data': range(90, 95)})
df3 = pd.merge(df1, df2, how='left')
print(df3)


df1=DataFrame({'subject':['语','数','外','理','化'],'data':range(90,95)})
df2=DataFrame({'subject':['语','数','外','史','地'],'data':range(90,95)})
df3=pd.merge(df1,df2,how='left')
print(df3)
执行结果:
Python
subject data

0 语 90

1 数 91

2 外 92

3 理 93

4 化 94


subjectdata

0语90

1数91

2外92

3理93

4化94

右连接

以右表为主,左表只显示交集部分的数据。

Python
df1 = DataFrame({'subject': ['语', '数', '外', '理', '化'], 'data': range(90, 95)})
df2 = DataFrame({'subject': ['语', '数', '外', '史', '地'], 'data': range(90, 95)})
df3 = pd.merge(df1, df2, how='right')
print(df3)


df1=DataFrame({'subject':['语','数','外','理','化'],'data':range(90,95)})
df2=DataFrame({'subject':['语','数','外','史','地'],'data':range(90,95)})
df3=pd.merge(df1,df2,how='right')
print(df3)
执行结果:
Python
subject data

0 语 90

1 数 91

2 外 92

3 史 93

4 地 94


subjectdata

0语90

1数91

2外92

3史93

4地94

全连接

显示两个表数据的并集。

Python
df1 = DataFrame({'subject': ['语', '数', '外', '理', '化'], 'data': range(90, 95)})
df2 = DataFrame({'subject': ['语', '数', '外', '史', '地'], 'data': range(90, 95)})
df3 = pd.merge(df1, df2, how='outer')
print(df3)


df1=DataFrame({'subject':['语','数','外','理','化'],'data':range(90,95)})
df2=DataFrame({'subject':['语','数','外','史','地'],'data':range(90,95)})
df3=pd.merge(df1,df2,how='outer')
print(df3)

执行结果:

Python

subject data

0 语 90

1 数 91

2 外 92

3 理 93

4 化 94

5 史 93

6 地 94


subjectdata

0语90

1数91

2外92

3理93

4化94

5史93

6地94

pandas 库的对于数据分析的基本用法就介绍到这里。