机器学习入门(二)数据分析处理库pandas

--------韦访 20181005

1、概述

上一讲我们简单学习了Numpy库,这一讲我们继续学习Python的数据处理库Pandas。

2、安装Pandas库

由于系统是新装的,还没安装Pandas库,所以得先安装,执行以下命令即可,

sudo apt-get install python-pandas

3、读取CSV数据

CSV其实就是用逗号做分隔符的文本文件,可以用excel打开,打开结果如下图所示,

机器学习入门(二)数据分析处理库pandas_第1张图片

如果用文本工具打开,则如下图所示,

机器学习入门(二)数据分析处理库pandas_第2张图片

处理这种数据,肯定先得读取吧,Pandas提供了读取CSV格式的函数,代码如下,

import pandas as pd

two_char_code = pd.read_csv('国家二字码.csv')
print('--------------------------')
print('输出列表头部:')
print(two_char_code.head())
print('--------------------------')
print('指定输出头部2行:')
print(two_char_code.head(2))
print('--------------------------')
print('指定输出尾部3行:')
print(two_char_code.tail(3))
print('--------------------------')
print('输出列表头:')
print(two_char_code.columns)
print('--------------------------')
print('输出每列的数据类型:')
print(two_char_code.dtypes)
print('--------------------------')
print('输出列表形状:')
print(two_char_code.shape)
print('--------------------------')
print('输出第4行数据(列表头不算,下标从0开始):')
print(two_char_code.loc[4])
print('--------------------------')
print('输出第4-8行数据(列表头不算,下标从0开始):')
print(two_char_code.loc[4:8])
print('--------------------------')
print('输出任意行数据:')
print(two_char_code.loc[[4,6,8]])
print('--------------------------')
print('输出一列数据:')
print(two_char_code['国家二字代码'])
print('--------------------------')
print('输出多列数据:')
print(two_char_code[['国家二字代码', '电话代码']])

运行结果,

--------------------------

输出列表头部:

    国家或地区(英文名) 国家或地区(中文名) 国家二字代码  电话代码  与中国时差

0       Angola        安哥拉     AO   244   -7.0

1  Afghanistan        阿富汗     AF    93    0.0

2      Albania      阿尔巴尼亚     AL   355   -7.0

3      Algeria      阿尔及利亚     DZ   213   -8.0

4      Andorra     安道尔共和国     AD   376   -8.0

--------------------------

指定输出头部2行:

    国家或地区(英文名) 国家或地区(中文名) 国家二字代码  电话代码  与中国时差

0       Angola        安哥拉     AO   244   -7.0

1  Afghanistan        阿富汗     AF    93    0.0

--------------------------

指定输出尾部3行:

    国家或地区(英文名) 国家或地区(中文名) 国家二字代码  电话代码  与中国时差

190   Zimbabwe       津巴布韦     ZW   263   -6.0

191      Zaire        扎伊尔     ZR   243   -7.0

192     Zambia        赞比亚     ZM   260   -6.0

--------------------------

输出列表头:

Index(['国家或地区(英文名)', '国家或地区(中文名)', '国家二字代码', '电话代码', '与中国时差'], dtype='object')

--------------------------

输出每列的数据类型:

国家或地区(英文名)     object

国家或地区(中文名)     object

国家二字代码         object

电话代码            int64

与中国时差         float64

dtype: object

--------------------------

输出列表形状:

(193, 5)

--------------------------

输出第4行数据(列表头不算,下标从0开始):

国家或地区(英文名)    Andorra

国家或地区(中文名)     安道尔共和国

国家二字代码             AD

电话代码              376

与中国时差              -8

Name: 4, dtype: object

--------------------------

输出第4-8行数据(列表头不算,下标从0开始):

            国家或地区(英文名) 国家或地区(中文名) 国家二字代码  电话代码  与中国时差

4              Andorra     安道尔共和国     AD   376   -8.0

5             Anguilla       安圭拉岛     AI  1264  -12.0

6  Antigua and Barbuda    安提瓜和巴布达     AG  1268  -12.0

7            Argentina        阿根廷     AR    54  -11.0

8              Armenia       亚美尼亚     AM   374   -6.0

--------------------------

输出任意行数据:

            国家或地区(英文名) 国家或地区(中文名) 国家二字代码  电话代码  与中国时差

4              Andorra     安道尔共和国     AD   376   -8.0

6  Antigua and Barbuda    安提瓜和巴布达     AG  1268  -12.0

8              Armenia       亚美尼亚     AM   374   -6.0

--------------------------

输出一列数据:

0       AO

1       AF

2       AL

3       DZ

4       AD

5       AI

      ...

188     YU

189     ZA

190     ZW

191     ZR

192     ZM

Name: 国家二字代码, Length: 193, dtype: object

--------------------------

输出多列数据:

    国家二字代码  电话代码

0       AO   244

1       AF    93

2       AL   355

3       DZ   213

4       AD   376

5       AI  1264

..     ...   ...

189     ZA    27

190     ZW   263

191     ZR   243

192     ZM   260

 

[193 rows x 2 columns]

 

4、排序

import pandas as pd

two_char_code = pd.read_csv('国家二字码.csv')
print('--------------------------')
print('原排序:')
print(two_char_code['国家二字代码'])
print('--------------------------')
two_char_code.sort_values('国家二字代码', inplace=True)
print('根据国家二字代码升序排序:')
print(two_char_code['国家二字代码'])
print('--------------------------')
two_char_code.sort_values('国家二字代码', inplace=True, ascending=False)
print('根据国家二字代码降序排序:')
print(two_char_code['国家二字代码'])

运行结果,

/usr/bin/python3.5 /home/wilf/tensorflow-r1.9/demo2/Pandas/demo1.py

--------------------------

原排序:

0       AO

1       AF

2       AL

3       DZ

4       AD

5       AI

6       AG

7       AR

8       AM

9      NaN

10      AU

      ...

186     VN

187     YE

188     YU

189     ZA

190     ZW

191     ZR

192     ZM

Name: 国家二字代码, Length: 193, dtype: object

--------------------------

根据国家二字代码升序排序:

4       AD

180     AE

1       AF

6       AG

5       AI

2       AL

      ...

185     VE

186     VN

187     YE

188     YU

189     ZA

157     ZA

192     ZM

191     ZR

190     ZW

9      NaN

32     NaN

80     NaN

106    NaN

107    NaN

116    NaN

119    NaN

139    NaN

144    NaN

145    NaN

Name: 国家二字代码, Length: 193, dtype: object

--------------------------

根据国家二字代码降序排序:

190     ZW

191     ZR

192     ZM

157     ZA

189     ZA

188     YU

      ...

27      BF

18      BE

15      BD

16      BB

12      AZ

10      AU

11      AT

7       AR

0       AO

8       AM

2       AL

5       AI

6       AG

1       AF

180     AE

4       AD

9      NaN

32     NaN

80     NaN

106    NaN

107    NaN

116    NaN

119    NaN

139    NaN

144    NaN

145    NaN

Name: 国家二字代码, Length: 193, dtype: object

可以看到,不管是升序还是降序,NaN都是排在最后的。

 

5、数据预处理

接下来,我们使用机器学习中常用的“泰坦尼克号”数据源来继续学习Pandas的数据处理,数据源格式也为CSV,首先显示前几行看看大概的格式,代码如下,

import pandas as pd

titanic_train = pd.read_csv('titanic_train.csv')
print('--------------------------')
print('泰坦尼克数据格式:')
print(titanic_train.head())

运行结果,

--------------------------

泰坦尼克数据格式:

   PassengerId  Survived  Pclass    ...        Fare Cabin  Embarked

0            1         0       3    ...      7.2500   NaN         S

1            2         1       1    ...     71.2833   C85         C

2            3         1       3    ...      7.9250   NaN         S

3            4         1       1    ...     53.1000  C123         S

4            5         0       3    ...      8.0500   NaN         S

 

[5 rows x 12 columns]

没显示全。那我截图好了,

机器学习入门(二)数据分析处理库pandas_第3张图片

如上图,数据包含泰坦尼克号上所有的乘员的一些信息,包括,姓名、年龄、性别、仓号等数据。

过滤缺失数据,

以“Age”为例,有些人的Age为空,那么怎么将他们过滤出来呢?代码如下,

print('--------------------------')
age = titanic_train['Age']
age_is_null = age[pd.isnull(age)]
print('无年龄人数:')
print(len(age_is_null))
print('过滤出年龄为空的人:')
print(age_is_null)

运行结果,

--------------------------

无年龄人数:

177

过滤出年龄为空的人:

5     NaN

17    NaN

19    NaN

26    NaN

28    NaN

29    NaN

31    NaN

       ..

846   NaN

849   NaN

859   NaN

863   NaN

868   NaN

878   NaN

888   NaN

Name: Age, Length: 177, dtype: float64

如果不处理缺失值会怎样?我们来看看,在不处理缺失值的情况下,求平均年龄,

print('--------------------------')
print('不处理缺失值的情况下,计算平均值:')
age = titanic_train['Age']
print(sum(age)/len(age))

运行结果:

--------------------------

不处理缺失值的情况下,计算平均值:

nan

运行的结果就为NaN,那就没法玩了。

 

处理缺失数据,

上面可知,不处理缺失数据是不行的,那么有哪些方法处理缺失数据呢?最简单的就是,直接跳过缺失数据,代码如下,

print('--------------------------')
print('跳过缺失数据:')
ages = titanic_train['Age'][pd.isnull(age) == False]
print(sum(ages)/len(ages))

运行结果:

--------------------------

跳过缺失数据:

29.69911764705882

其实,Pandas已经提供求均值的函数了,且该方法自动跳过缺失数据,代码如下,

print('--------------------------')
print('自带求均值函数:')
mean_age = titanic_train['Age'].mean()
print(mean_age)

运行结果:

--------------------------

自带求均值函数:

29.69911764705882

 

缺失的数据有177个,占比很大,如果因为年龄的缺失就直接丢弃,损失有点大,何不用年龄的均值进行填充呢?代码如下,

print('--------------------------')
print('以均值填充缺失值:')
mean_age = titanic_train['Age'].mean()
age = titanic_train['Age']
age_is_null = age[pd.isnull(age)]
age_is_null.fillna(mean_age, inplace=True)
print(age_is_null)

运行结果:

--------------------------

以均值填充缺失值:

5      29.699118

17     29.699118

19     29.699118

26     29.699118

28     29.699118

         ...    

846    29.699118

849    29.699118

859    29.699118

863    29.699118

868    29.699118

878    29.699118

888    29.699118

Name: Age, Length: 177, dtype: float64

 

透视表pivot_table

由泰坦尼克数据集可知,一等票之间的价格不一样一样,比如同是一等票,有的要71.283元,有些要51.863元,二、三等票也是这样,那么,如想求一、二、三等票的均价怎么求呢?最直接的方法就是分别将一、二、三等票求均值,Pandas提供了更简洁的方法,代码如下,

print('--------------------------')
print('分别求一二三等票的均价:')
pclass_fare = titanic_train.pivot_table(index='Pclass', values='Fare', aggfunc=np.mean)
print(pclass_fare)

运行结果,

--------------------------

分别求一二三等票的均价:

             Fare

Pclass           

1       84.154687

2       20.662183

3       13.675550

也可以求和,代码如下,

print('--------------------------')
print('分别求一二三等票的和:')
pclass_fare = titanic_train.pivot_table(index='Pclass', values='Fare', aggfunc=np.sum)
print(pclass_fare)

运行结果,

--------------------------

分别求一二三等票的和:

              Fare

Pclass            

1       18177.4125

2        3801.8417

3        6714.6951

 

6、自定义函数

虽然Pandas提供了很多函数,但有时候我们还是需要使用自定义的函数,怎么办呢?上代码,

print('--------------------------')
print('自定义函数:')
def not_nan_count(column):
    nan_column = pd.isnull(column)
    nan = column[nan_column]
    return len(nan)
null_column = titanic_train.apply(not_nan_count)
print(null_column)

运行结果:

--------------------------

自定义函数:

PassengerId      0

Survived         0

Pclass           0

Name             0

Sex              0

Age            177

SibSp            0

Parch            0

Ticket           0

Fare             0

Cabin          687

Embarked         2

dtype: int64

 

如果您感觉本篇博客对您有帮助,请打开支付宝,领个红包支持一下,祝您扫到99元,谢谢~~

你可能感兴趣的:(机器学习,Pandas)