python mean dropna_小丸子踏入python之路:python_day05(用Pandas处理泰坦尼克船员获救数据titanic_train.csv)...
泰坦尼克船員獲救數(shù)據(jù):
titanic_train.csv
用excel打開(kāi)數(shù)據(jù)集。顯示如下:
寫(xiě)在前邊:
為了方便以后運(yùn)用numpy和pandas的庫(kù),分別造它們的別名np和pd.
import pandas as pd #造pandas的別名為pd
import numpy as np #造numpy的別名為np
一、讀取數(shù)據(jù)
import pandas as pd #造pandas的別名為pd
import numpy as np #造numpy的別名為np
#泰坦尼克號(hào)船員獲救數(shù)據(jù)
titanic_survival = pd.read_csv("titanic_train.csv")
titanic_survival.head()#head()無(wú)參數(shù),默認(rèn)返回?cái)?shù)據(jù)的前5行
運(yùn)行結(jié)果:
二、對(duì)數(shù)據(jù)進(jìn)行處理
1.?用.isnull()來(lái)處理數(shù)據(jù)的缺失值
其實(shí)數(shù)據(jù)都有缺失值,在進(jìn)行數(shù)據(jù)處理的時(shí)候首先對(duì)缺失值要有一個(gè)詳細(xì)的了解。
下邊將通過(guò)對(duì)列“age”列的處理來(lái)看一下缺失值的情況的。
用.isnull()可以返回缺失值的情況。若當(dāng)前值缺失,返回true,否則返回false。
age = titanic_survival["Age"]print(age.loc[0:10]) #顯示age數(shù)據(jù)的0——10行
#用.isnull()對(duì)缺失值進(jìn)行處理。若當(dāng)前的值為一個(gè)缺失值,則返回true,否則返回false
age_is_null =pd.isnull(age)print(age_is_null)#將age_is_null的值為true的留下來(lái),把a(bǔ)ge_is_null值為false的過(guò)濾掉
age_null_true =age[age_is_null]print(age_null_true) #打印所有的缺失值
age_null_count= len(age_null_true) #打印缺失值的個(gè)數(shù)
print("age屬性缺失值的個(gè)數(shù):",age_null_count)
運(yùn)行結(jié)果:
2.缺失值的那點(diǎn)事
2.1 當(dāng)不對(duì)缺失值進(jìn)行處理的時(shí)候會(huì)有什么后果呢?
為什么要對(duì)缺失值進(jìn)行處理?
打比方:
目標(biāo):現(xiàn)在想要求出船員的平均年齡。
過(guò)程:則對(duì)“Age”這列數(shù)據(jù)進(jìn)行操作。用sum()函數(shù)求出船員的年齡總和。用len()求出樣本數(shù)據(jù)的長(zhǎng)度,即船員的個(gè)數(shù)。
#目標(biāo):求船員的平均年齡#過(guò)程:用sum()函數(shù)求出船員的年齡總和。用len()求出樣本數(shù)據(jù)的長(zhǎng)度,即船員的個(gè)數(shù)
mean_age = sum(titanic_survival["Age"])/len(titanic_survival["Age"]) #船員的平均年齡
print("平均年齡 =",mean_age) #打印平均年齡
那么這樣的操作是否能得到我們想要的結(jié)果呢?
運(yùn)行結(jié)果:
這樣的顯示結(jié)果是因?yàn)樵镜摹癆ge”數(shù)據(jù)中存在缺失值,而缺失值會(huì)被標(biāo)記為NaN,所以參與運(yùn)算后平均年齡的返回結(jié)果為NaN
2.2?如何對(duì)缺失值未處理造成的后果進(jìn)行調(diào)整呢?
由2.1明顯的看出缺失值的錯(cuò)在對(duì)數(shù)據(jù)的處理帶來(lái)的后果,那么接下來(lái),我們就用不同的方法對(duì)其進(jìn)行解決。
2.2.1?直接過(guò)濾缺失值的辦法。
有第一節(jié)中,age_is_null的變量,我們得到了關(guān)于是否為缺失值的返回。
當(dāng)其為缺失值的時(shí)候,age_is_null = True
但其不是缺失值的時(shí)候,age_is_null = False
#對(duì)上邊缺失值導(dǎo)致結(jié)果出不來(lái)的情況進(jìn)行一個(gè)處理。
#最簡(jiǎn)單的方法就是把有缺失值的直接去掉,只保留沒(méi)有缺失值的,并進(jìn)行運(yùn)算。
good_ages = titanic_survival["Age"][age_is_null ==False]#[age_is_null == False]若沒(méi)有缺失值,則保留。(由此濾去缺失值)#print(good_ages)
correct_mean_age = sum(good_ages) /len(good_ages)print("平均年齡 =",correct_mean_age)
運(yùn)行結(jié)果:
2.2.2?直接用pandas中提供的mean()方法來(lái)處理
correct_mean_age = titanic_survival["Age"].mean() #直接用Pandas中自帶的mean()函數(shù)求平均
print("用mean()得到的平均年齡 =",correct_mean_age)
運(yùn)行結(jié)果:
2.2.3?注意
其實(shí)直接濾去缺失值的樣本并不是一個(gè)很好的方法,其實(shí)我們可以拿年齡的平均數(shù)、中位數(shù)、重?cái)?shù)進(jìn)行一個(gè)填充。
3.求每類船艙對(duì)應(yīng)的平均票價(jià)
3.1?用for循環(huán)的方式求出平均
要求:船艙等級(jí)一共有[1,2,3]三種,分別對(duì)應(yīng)不同的票價(jià),所以每一級(jí)船艙都有自己的平均票價(jià)。求每級(jí)船艙的平均票價(jià)。
過(guò)程:通過(guò)for循環(huán)對(duì)每一類船艙進(jìn)去抽取,抽取出屬于同一類船艙等級(jí)的船客的全部信息,再?gòu)拿恳粋€(gè)分類船客中抽出“Fare”(船票價(jià)格)這列數(shù)據(jù),對(duì)其用,mean()函數(shù)求平均,再返回給每一類的類別。
#船艙等級(jí)一共有3種,求每一種船艙等級(jí)對(duì)應(yīng)的平均票價(jià)
passenger_classes = [1,2,3] #船艙等級(jí)用list列出[1,2,3]
fares_by_class = {} #定義空的字典,用來(lái)存放船艙等級(jí)以及對(duì)應(yīng)的平均票價(jià)
for this_class in passenger_classes: #對(duì)每一類船艙進(jìn)行循環(huán)
pclass_rows = titanic_survival[titanic_survival["Pclass"] == this_class] #當(dāng)this_class = 1時(shí),返回的是所有一等艙的船客的信息
#this_class = 2/3時(shí)同理
pclass_fares = pclass_rows["Fare"] #再?gòu)拿看稳〉玫男畔⒅?#xff0c;返回“Fare”(票價(jià))這列的數(shù)據(jù)
fare_for_class = pclass_fares.mean() #用.mean()對(duì)票價(jià)求平均
fares_by_class[this_class] = fare_for_class #將對(duì)應(yīng)的平均票價(jià)傳給對(duì)應(yīng)的船艙
print("每類船艙對(duì)應(yīng)的平均票價(jià) =", fares_by_class)
運(yùn)行結(jié)果:
3.2?用pandas自帶的函數(shù).pivot_table()來(lái)統(tǒng)計(jì)船艙等級(jí)與平均票價(jià)的關(guān)系
看了3.1后發(fā)現(xiàn),我們的需求很簡(jiǎn)單,但是代碼實(shí)現(xiàn)起來(lái)并不是很簡(jiǎn)便,那么有沒(méi)有什么Pandas自帶的方法來(lái)簡(jiǎn)便的完成這類數(shù)據(jù)統(tǒng)計(jì)的操作呢?答案當(dāng)然是肯定的啦,不然我怎么會(huì)又開(kāi)了3.2.?吼吼
.pivot_table() :?相當(dāng)于一個(gè)數(shù)據(jù)透視表。
也相當(dāng)于統(tǒng)計(jì)一個(gè)量與其他量之間關(guān)系的一個(gè)函數(shù)
.pivot_table()有三個(gè)參數(shù):
index:表示接下來(lái)要統(tǒng)計(jì)的信息是以誰(shuí)為基準(zhǔn)的,index就 = 誰(shuí)
values:表示用統(tǒng)計(jì)index與誰(shuí)之間的關(guān)系,values就 = 誰(shuí)
aggfunc:表示index與values之間的什么關(guān)系,aggfunc就 = 什么關(guān)系(不寫(xiě)的話,默認(rèn)求均值)
#用.pivot_table來(lái)統(tǒng)計(jì)Pclass和Fare之間的關(guān)系#三個(gè)參數(shù):index:表示接下來(lái)要統(tǒng)計(jì)的信息是以誰(shuí)為基準(zhǔn)的,index就=誰(shuí)(每個(gè)船艙等級(jí)對(duì)應(yīng)的平均票價(jià),所以index = Pclass船艙等級(jí))#values:表示用統(tǒng)計(jì)Pclass與誰(shuí)之間的關(guān)系,values就=誰(shuí)(Pclass與票價(jià)之間的關(guān)系,values = Fare)#aggfunc:表示Pclass與Fare之間的什么關(guān)系,求的是船艙等級(jí)與票價(jià)的平均值之間的關(guān)系,所以aggfunc=np.mean()passenger_classes = titanic_survival.pivot_table(index = "Pclass",values = "Fare",aggfunc =np.mean)print(passenger_classes)
運(yùn)行結(jié)果:
4.用.pivot_table()求每類船艙對(duì)應(yīng)的平均存活率
#求每類船艙對(duì)應(yīng)的存活率#.pivot_table的三個(gè)參數(shù):#三個(gè)參數(shù):index:表示接下來(lái)要統(tǒng)計(jì)的信息是以誰(shuí)為基準(zhǔn)的,index就=誰(shuí)(每個(gè)船艙等級(jí)對(duì)應(yīng)的平均存活率,所以index = Pclass船艙等級(jí))#values:表示用統(tǒng)計(jì)Pclass與誰(shuí)之間的關(guān)系,values就=誰(shuí)(Pclass與存活率之間的關(guān)系,values = Survived)#aggfunc:表示Pclass與Survived之間的什么關(guān)系,求的是船艙等級(jí)的平均存活率的關(guān)系,所以aggfunc=np.mean()
passenger_survical = titanic_survival.pivot_table(index = "Pclass",values = "Survived",aggfunc =np.mean)print(passenger_survical)
運(yùn)行結(jié)果:
5.用.pivot_table()求每類船艙對(duì)應(yīng)的平均年齡
#求每類船艙對(duì)應(yīng)的平均年齡#.pivot_table的三個(gè)參數(shù):#三個(gè)參數(shù):index:表示接下來(lái)要統(tǒng)計(jì)的信息是以誰(shuí)為基準(zhǔn)的,index就=誰(shuí)(每個(gè)船艙等級(jí)對(duì)應(yīng)的平均年齡,所以index = Pclass船艙等級(jí))#values:表示用統(tǒng)計(jì)Pclass與誰(shuí)之間的關(guān)系,values就=誰(shuí)(Pclass與年齡之間的關(guān)系,values = Age)#aggfunc:表示Pclass與Age之間的什么關(guān)系,求的是船艙等級(jí)的平均年齡的關(guān)系,所以aggfunc=np.mean()
passenger_age = titanic_survival.pivot_table(index = "Pclass",values = "Age",aggfunc =np.mean)print(passenger_age)
運(yùn)行結(jié)果:
6.?用.pivot_table()看一個(gè)量與其他兩個(gè)量之間的關(guān)系
需求:想要看不同的登船地點(diǎn)(C,Q,S)的總的票價(jià)和總的獲救人數(shù)。
過(guò)程:用.pivot_table()的話,對(duì)于index ,接下來(lái)要統(tǒng)計(jì)的東西是以登船地點(diǎn)為基準(zhǔn)的,所以index = "Embarked"
對(duì)于values,要統(tǒng)計(jì)的是不同登船地點(diǎn)與票價(jià)和是否獲救之間的關(guān)系,所以values = ["Fare","Survived" ]
對(duì)于aggfunc,要統(tǒng)計(jì)的是不同登船地點(diǎn)的總的票價(jià)和總的獲救人數(shù),所以aggfunc = np.sum
port_stats = titanic_survival.pivot_table(index = "Embarked",values = ["Fare","Survived"],aggfunc =np.sum)print(port_stats)
運(yùn)行結(jié)果:
7.?用.dropna()扔掉具有缺失值的行
#用.dropna扔掉具有缺失值的行
titanic_survival.head(7)
new_titanic_survival= titanic_survival.dropna(axis = 0,subset = ["Age","Sex"])#看一些Age和Sex這兩列有沒(méi)有缺失值的,如果有,就把具有缺失值的這行數(shù)據(jù)扔掉。
titanic_survival.head(7)#new_titanic_survival.head(7) #分別把drop前后的前7行數(shù)據(jù)看一下吧
運(yùn)行結(jié)果:dropna之前的數(shù)據(jù)
注意:此打印的結(jié)果是不帶print的打印方式,因?yàn)閹в衟rint的打印一行顯示不完,看起來(lái)不夠清楚。
dropna之后的數(shù)據(jù)
8.?用.loc()確定到每一個(gè)坐標(biāo)上的數(shù)據(jù)
數(shù)據(jù)中每一個(gè)具體的值都是由一個(gè)行號(hào)和列名唯一確定的,所以完全可以用行號(hào)和列名來(lái)返回這個(gè)位置上的值。
#如何取確定位置上的一個(gè)數(shù)據(jù)
row_index_83_age = titanic_survival.loc[83,"Age"]
row_index_766_pclass= titanic_survival.loc[766,"Pclass"]print("第83行的age =",row_index_83_age)print("第766行的pclass =",row_index_766_pclass)
運(yùn)行結(jié)果:
9.用.sort_values()進(jìn)行數(shù)據(jù)的重新排序,并用.reset_index()重置排序后的index值(即行號(hào))。
用.sort_values()對(duì)數(shù)據(jù)進(jìn)行排序后,雖然行的順序因?yàn)榕判驐l件發(fā)生了變化,但是其行號(hào)卻還保持著之前的樣子,為了讓排序后的數(shù)據(jù)的行號(hào)變成從0開(kāi)始,依次增大,所以運(yùn)用.reset_index()進(jìn)行重置。
new_titanic_survival = titanic_survival.sort_values("Age",ascending = False) #根據(jù)“Age”的大小逆序排列。#print(new_titanic_survival[0:10]) #打印未進(jìn)行.reset_index時(shí)的數(shù)據(jù)前10行
titanic_reindexed = new_titanic_survival.reset_index(drop =True)#print(titanic_reindexed.loc[0:10])
new_titanic_survival[0:10]titanic_reindexed.loc[0:10]
運(yùn)行結(jié)果:
注意:此打印的結(jié)果是不帶print的打印方式,因?yàn)閹в衟rint的打印一行顯示不完,看起來(lái)不夠清楚。
未進(jìn)行.reset_index時(shí)的數(shù)據(jù)前10行
進(jìn)行.reset_index后的數(shù)據(jù)前邊10行
10、apply(自定義函數(shù)名)的功能
我們知道pandas已經(jīng)提供了很多個(gè)功能強(qiáng)大的函數(shù),但是還是會(huì)有一些具體的操作沒(méi)有辦法直接用已經(jīng)定義的函數(shù)來(lái)完成的,此時(shí)我們應(yīng)該如何執(zhí)行這些呢?
一方面,可以通過(guò)寫(xiě)代碼慢慢的拼接出來(lái)。
另一方面,可以通過(guò)寫(xiě)apply()函數(shù),而這個(gè)apply()函數(shù)就相當(dāng)于我們可以進(jìn)行一個(gè)自定義函數(shù)的操作。
在apply()中傳進(jìn)來(lái)的是一個(gè)函數(shù)名,而傳進(jìn)來(lái)的函數(shù)可以是自己定義的函數(shù),即將自己的操作定義成一個(gè)函數(shù)的形式,然后apply一下,這時(shí)就會(huì)在這個(gè)DataFrame中執(zhí)行這個(gè)操作了。
10.1?關(guān)于apply(自定義函數(shù)名)?的第一個(gè)例子
具體如下所示:
需求:我們想要返回?cái)?shù)據(jù)集合的第100行數(shù)據(jù)。
過(guò)程:先定義一個(gè)返回第100行數(shù)據(jù)的函數(shù)hundredth_row ,然后在apply一下
#定義一個(gè)新的函數(shù)hundredth_row,用來(lái)返回第100行數(shù)據(jù)
defhundredth_row(column):
hundredth_item= column.loc[99]returnhundredth_item
hundredth_row= titanic_survival.apply(hundredth_row) #將新定義好的函數(shù)apply一下
print(hundredth_row)
運(yùn)行結(jié)果:
10.2 關(guān)于apply(自定義函數(shù)名)?的第二個(gè)例子
用apply(自定義函數(shù)名)來(lái)得到每一個(gè)屬性缺失值的個(gè)數(shù)。
#返回所有屬性缺失值的個(gè)數(shù)
defisnull_count(column):
column_null= pd.isnull(column) #返回值是true或flase
null = column[column_null] #缺失值列表
returnlen(null)
column_null_count=titanic_survival.apply(isnull_count)print(column_null_count)
運(yùn)行結(jié)果:
10.3 關(guān)于apply(自定義函數(shù)名)?的第三個(gè)例子
用apply(自定義函數(shù)名)來(lái)對(duì)船艙等級(jí)【1,2,3】進(jìn)行一個(gè)改寫(xiě),改成First Class,Second Class ,Third Class
#將船艙等級(jí)進(jìn)行一個(gè)轉(zhuǎn)化,1——First Class....
defwhich_class(row):
pclass= row["Pclass"]ifpd.isnull(pclass):return "UnKnown"
elif pclass == 1:return "First Class"
elif pclass == 2:return "Second Class"
elif pclass == 3:return "Third Class"classes= titanic_survival.apply(which_class,axis = 1)print(classes)
運(yùn)行結(jié)果:
10.4 關(guān)于apply(自定義函數(shù)名)?的第四個(gè)例子
將年齡離散化,在本實(shí)例數(shù)據(jù)集上的“Age”是一個(gè)連續(xù)的值,這里以18為界限,將其離散化。
defgenerate_age_label(row):
age= row["Age"]ifpd.isnull(age):return "Unknow"
elif age < 18:return "minor"
else:return "adult"age_labels= titanic_survival.apply(generate_age_label, axis = 1)print(age_labels)
運(yùn)行結(jié)果:
友情贈(zèng)送
利用上邊的自定義函數(shù),使用.pivot_table()函數(shù)得到年齡階段與獲救率之間的關(guān)系。
titanic_survival["age_labels"] = age_labels #將上一個(gè)里邊返回的關(guān)于age_labels的數(shù)據(jù)組合成數(shù)據(jù)的一列#得到年齡階段與存活率之間的關(guān)系
age_group_survival = titanic_survival.pivot_table(index = "age_labels",values = "Survived")print(age_group_survival)
運(yùn)行結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的python mean dropna_小丸子踏入python之路:python_day05(用Pandas处理泰坦尼克船员获救数据titanic_train.csv)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HTML5知识点汇总
- 下一篇: cad添加自己线性_如何在CAD中添加自