机器学习入门(二)数据分析处理库pandas
--------韋訪 20181005
1、概述
上一講我們簡單學習了Numpy庫,這一講我們繼續學習Python的數據處理庫Pandas。
2、安裝Pandas庫
由于系統是新裝的,還沒安裝Pandas庫,所以得先安裝,執行以下命令即可,
sudo apt-get install python-pandas
3、讀取CSV數據
CSV其實就是用逗號做分隔符的文本文件,可以用excel打開,打開結果如下圖所示,
如果用文本工具打開,則如下圖所示,
處理這種數據,肯定先得讀取吧,Pandas提供了讀取CSV格式的函數,代碼如下,
import pandas as pdtwo_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 pdtwo_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 pdtitanic_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元,謝謝~~
總結
以上是生活随笔為你收集整理的机器学习入门(二)数据分析处理库pandas的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网站注册页面
- 下一篇: School:1靶机