日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习入门(二)数据分析处理库pandas 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

--------韋訪 20181005

1、概述

上一講我們簡單學習了Numpy庫,這一講我們繼續(xù)學習Python的數(shù)據(jù)處理庫Pandas。

2、安裝Pandas庫

由于系統(tǒng)是新裝的,還沒安裝Pandas庫,所以得先安裝,執(zhí)行以下命令即可,

sudo apt-get install python-pandas

3、讀取CSV數(shù)據(jù)

CSV其實就是用逗號做分隔符的文本文件,可以用excel打開,打開結(jié)果如下圖所示,

如果用文本工具打開,則如下圖所示,

處理這種數(shù)據(jù),肯定先得讀取吧,Pandas提供了讀取CSV格式的函數(shù),代碼如下,

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('輸出每列的數(shù)據(jù)類型:') print(two_char_code.dtypes) print('--------------------------') print('輸出列表形狀:') print(two_char_code.shape) print('--------------------------') print('輸出第4行數(shù)據(jù)(列表頭不算,下標從0開始):') print(two_char_code.loc[4]) print('--------------------------') print('輸出第4-8行數(shù)據(jù)(列表頭不算,下標從0開始):') print(two_char_code.loc[4:8]) print('--------------------------') print('輸出任意行數(shù)據(jù):') print(two_char_code.loc[[4,6,8]]) print('--------------------------') print('輸出一列數(shù)據(jù):') print(two_char_code['國家二字代碼']) print('--------------------------') print('輸出多列數(shù)據(jù):') print(two_char_code[['國家二字代碼', '電話代碼']])

運行結(jié)果,

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

輸出列表頭部:

????國家或地區(qū)(英文名) 國家或地區(qū)(中文名) 國家二字代碼 ?電話代碼 ?與中國時差

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行:

????國家或地區(qū)(英文名) 國家或地區(qū)(中文名) 國家二字代碼 ?電話代碼 ?與中國時差

0 ??????Angola ???????安哥拉 ????AO ??244 ??-7.0

1 ?Afghanistan ???????阿富汗 ????AF ???93 ???0.0

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

指定輸出尾部3行:

????國家或地區(qū)(英文名) 國家或地區(qū)(中文名) 國家二字代碼 ?電話代碼 ?與中國時差

190 ??Zimbabwe ??????津巴布韋 ????ZW ??263 ??-6.0

191 ?????Zaire ???????扎伊爾 ????ZR ??243 ??-7.0

192 ????Zambia ???????贊比亞 ????ZM ??260 ??-6.0

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

輸出列表頭:

Index(['國家或地區(qū)(英文名)', '國家或地區(qū)(中文名)', '國家二字代碼', '電話代碼', '與中國時差'], dtype='object')

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

輸出每列的數(shù)據(jù)類型:

國家或地區(qū)(英文名) ????object

國家或地區(qū)(中文名) ????object

國家二字代碼 ????????object

電話代碼 ???????????int64

與中國時差 ????????float64

dtype: object

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

輸出列表形狀:

(193, 5)

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

輸出第4行數(shù)據(jù)(列表頭不算,下標從0開始):

國家或地區(qū)(英文名) ???Andorra

國家或地區(qū)(中文名) ????安道爾共和國

國家二字代碼 ????????????AD

電話代碼 ?????????????376

與中國時差 ?????????????-8

Name: 4, dtype: object

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

輸出第4-8行數(shù)據(jù)(列表頭不算,下標從0開始):

????????????國家或地區(qū)(英文名) 國家或地區(qū)(中文名) 國家二字代碼 ?電話代碼 ?與中國時差

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

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

輸出任意行數(shù)據(jù):

????????????國家或地區(qū)(英文名) 國家或地區(qū)(中文名) 國家二字代碼 ?電話代碼 ?與中國時差

4 ?????????????Andorra ????安道爾共和國 ????AD ??376 ??-8.0

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

8 ?????????????Armenia ??????亞美尼亞 ????AM ??374 ??-6.0

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

輸出一列數(shù)據(jù):

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

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

輸出多列數(shù)據(jù):

????國家二字代碼 ?電話代碼

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('根據(jù)國家二字代碼升序排序:') print(two_char_code['國家二字代碼']) print('--------------------------') two_char_code.sort_values('國家二字代碼', inplace=True, ascending=False) print('根據(jù)國家二字代碼降序排序:') print(two_char_code['國家二字代碼'])

運行結(jié)果,

/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

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

根據(jù)國家二字代碼升序排序:

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

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

根據(jù)國家二字代碼降序排序:

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、數(shù)據(jù)預處理

接下來,我們使用機器學習中常用的“泰坦尼克號”數(shù)據(jù)源來繼續(xù)學習Pandas的數(shù)據(jù)處理,數(shù)據(jù)源格式也為CSV,首先顯示前幾行看看大概的格式,代碼如下,

import pandas as pdtitanic_train = pd.read_csv('titanic_train.csv') print('--------------------------') print('泰坦尼克數(shù)據(jù)格式:') print(titanic_train.head())

運行結(jié)果,

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

泰坦尼克數(shù)據(jù)格式:

???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]

沒顯示全。那我截圖好了,

如上圖,數(shù)據(jù)包含泰坦尼克號上所有的乘員的一些信息,包括,姓名、年齡、性別、倉號等數(shù)據(jù)。

過濾缺失數(shù)據(jù),

以“Age”為例,有些人的Age為空,那么怎么將他們過濾出來呢?代碼如下,

print('--------------------------') age = titanic_train['Age'] age_is_null = age[pd.isnull(age)] print('無年齡人數(shù):') print(len(age_is_null)) print('過濾出年齡為空的人:') print(age_is_null)

運行結(jié)果,

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

無年齡人數(shù):

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))

運行結(jié)果:

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

不處理缺失值的情況下,計算平均值:

nan

運行的結(jié)果就為NaN,那就沒法玩了。

?

處理缺失數(shù)據(jù),

上面可知,不處理缺失數(shù)據(jù)是不行的,那么有哪些方法處理缺失數(shù)據(jù)呢?最簡單的就是,直接跳過缺失數(shù)據(jù),代碼如下,

print('--------------------------') print('跳過缺失數(shù)據(jù):') ages = titanic_train['Age'][pd.isnull(age) == False] print(sum(ages)/len(ages))

運行結(jié)果:

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

跳過缺失數(shù)據(jù):

29.69911764705882

其實,Pandas已經(jīng)提供求均值的函數(shù)了,且該方法自動跳過缺失數(shù)據(jù),代碼如下,

print('--------------------------') print('自帶求均值函數(shù):') mean_age = titanic_train['Age'].mean() print(mean_age)

運行結(jié)果:

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

自帶求均值函數(shù):

29.69911764705882

?

缺失的數(shù)據(jù)有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)

運行結(jié)果:

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

以均值填充缺失值:

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

由泰坦尼克數(shù)據(jù)集可知,一等票之間的價格不一樣一樣,比如同是一等票,有的要71.283元,有些要51.863元,二、三等票也是這樣,那么,如想求一、二、三等票的均價怎么求呢?最直接的方法就是分別將一、二、三等票求均值,Pandas提供了更簡潔的方法,代碼如下,

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

運行結(jié)果,

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

分別求一二三等票的均價:

?????????????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)

運行結(jié)果,

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

分別求一二三等票的和:

??????????????Fare

Pclass ???????????

1 ??????18177.4125

2 ???????3801.8417

3 ???????6714.6951

?

6、自定義函數(shù)

雖然Pandas提供了很多函數(shù),但有時候我們還是需要使用自定義的函數(shù),怎么辦呢?上代碼,

print('--------------------------') print('自定義函數(shù):') 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)

運行結(jié)果:

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

自定義函數(shù):

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元,謝謝~~

總結(jié)

以上是生活随笔為你收集整理的机器学习入门(二)数据分析处理库pandas的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。