--------韦访 20181005
1、概述
上一讲我们简单学习了Numpy库,这一讲我们继续学习Python的数据处理库Pandas。
2、安装Pandas库
由于系统是新装的,还没安装Pandas库,所以得先安装,执行以下命令即可,
sudo apt-get install python-pandas
3、读取CSV数据
CSV其实就是用逗号做分隔符的文本文件,可以用excel打开,打开结果如下图所示,
如果用文本工具打开,则如下图所示,
处理这种数据,肯定先得读取吧,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]
没显示全。那我截图好了,
如上图,数据包含泰坦尼克号上所有的乘员的一些信息,包括,姓名、年龄、性别、仓号等数据。
过滤缺失数据,
以“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元,谢谢~~