版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
大數(shù)據(jù)分析:基于Python
第7章
數(shù)據(jù)處理與分析余本國(guó)在數(shù)據(jù)分析過(guò)程中,據(jù)不完全統(tǒng)計(jì),百分之七八十的工作量都是在做數(shù)據(jù)清洗,即數(shù)據(jù)處理成所需要的數(shù)據(jù)形式和格式。所以數(shù)據(jù)處理對(duì)于數(shù)據(jù)分析來(lái)說(shuō)是至關(guān)重要的。只有當(dāng)數(shù)據(jù)被正確地清洗和處理之后,才能確保分析結(jié)果的準(zhǔn)確性和可靠性。如果數(shù)據(jù)中存在錯(cuò)誤、重復(fù)、缺失或不一致的情況,那么分析結(jié)果可能會(huì)出現(xiàn)偏差,甚至誤導(dǎo)決策。數(shù)據(jù)處理包括多個(gè)步驟,例如數(shù)據(jù)收集、數(shù)據(jù)清洗、數(shù)據(jù)轉(zhuǎn)換和數(shù)據(jù)規(guī)范化等。其中,數(shù)據(jù)清洗是最耗費(fèi)時(shí)間和精力的一步,因?yàn)樗婕暗讲檎液托迯?fù)數(shù)據(jù)中的錯(cuò)誤和不一致,處理缺失值和重復(fù)數(shù)據(jù),以及檢查數(shù)據(jù)的格式和類型等。在數(shù)據(jù)清洗過(guò)程中,需要使用各種技術(shù)和工具,例如數(shù)據(jù)篩選、排序、查找和替換、正則表達(dá)式等,以確保數(shù)據(jù)的質(zhì)量和可靠性。此外,還需要了解數(shù)據(jù)的來(lái)源和特點(diǎn),以便更好地理解和處理數(shù)據(jù)。7.1數(shù)據(jù)預(yù)處理數(shù)據(jù)預(yù)處理包括對(duì)收集到的原始數(shù)據(jù)進(jìn)行格式化、規(guī)范化、去重、去除噪聲和異常值等操作。這個(gè)步驟中需要使用各種技術(shù)和算法,完成數(shù)據(jù)去重、修剪、替換、填充、歸一化、缺失值處理等操作,以確保數(shù)據(jù)的質(zhì)量和正確性。7.1.1異常值處理異常值處理包括重復(fù)值和缺失值以及離群點(diǎn)的處理,尤其對(duì)缺失值的處理要謹(jǐn)慎。當(dāng)數(shù)據(jù)量較大時(shí),并且在刪除缺失值時(shí)不影響結(jié)論時(shí),可以刪除,當(dāng)數(shù)據(jù)量較少時(shí),刪除后可能會(huì)影響數(shù)據(jù)分析的結(jié)果時(shí),最好對(duì)缺失值進(jìn)行填充。以下是一些常見(jiàn)的異常值處理方法。在處理異常值時(shí),一定要考慮到數(shù)據(jù)的整體分布和業(yè)務(wù)背景,避免盲目處理導(dǎo)致數(shù)據(jù)失真或者誤導(dǎo)分析結(jié)果。1.重復(fù)值處理重復(fù)值的處理是把數(shù)據(jù)結(jié)構(gòu)中重復(fù)的行數(shù)據(jù)去除,僅保留重復(fù)值其中的一行。Python中的Pandas模塊對(duì)重復(fù)數(shù)據(jù)去重步驟:(1)利用DataFrame中的duplicated()方法返回一個(gè)布爾型的Series,顯示是否有重復(fù)行,沒(méi)有重復(fù)行顯示為FALSE,有重復(fù)行則從重復(fù)的第二行起,重復(fù)的行均顯示為T(mén)RUE;(2)再利用DataFrame中的drop_duplicates()方法,用于返回一個(gè)移除了重復(fù)行的DataFrame。(3)使用df[df.a.duplicated()]顯示重復(fù)值。如果僅僅是刪除重復(fù)值,第一步用duplicated()返回布爾值可以省略。顯示重復(fù)值duplicated()函數(shù)格式如下:duplicated(self,subset=None,keep='first')其中參數(shù)解釋如下:subset:用于識(shí)別重復(fù)的列標(biāo)簽或列標(biāo)簽序列,默認(rèn)所有列標(biāo)簽keep=‘frist’:除了第一次出現(xiàn)外,其余相同的被標(biāo)記為重復(fù)keep='last':除了最后一次出現(xiàn)外,其余相同的被標(biāo)記為重復(fù)keep=False:所有相同的都被標(biāo)記為重復(fù)drop_duplicates():把數(shù)據(jù)結(jié)構(gòu)中行相同的數(shù)據(jù)去除(僅保留重復(fù)行中的一行)。如果duplicated方法和drop_duplicates方法中沒(méi)有設(shè)置參數(shù),則這兩個(gè)方法默認(rèn)判斷全部列;如果在這兩個(gè)方法中加入了指定的屬性名(列名),例如:frame.drop_duplicates(['state']),則指定部分屬性(state列)進(jìn)行重復(fù)項(xiàng)的判斷。In[1]:frompandasimportDataFramefrompandasimportSeriesdf=DataFrame({'age':Series([26,85,64,85,85]),'name':Series(['Yubg','John’,'Jerry','Cd’,
'John'])})dfOut[1]:agename026Yubg185John264Jerry385Cd485JohnIn[2]:df.duplicated()#返回邏輯值,重復(fù)的行(第二次出現(xiàn))顯示TrueOut[2]:0False1False2False3False4Truedtype:bool
In[3]:df[df.duplicated()]#顯示重復(fù)行Out[3]:agename485John
In[4]:df.duplicated('name')Out[4]:0False1False2False3False4Truedtype:boolIn[5]:df[~df.duplicated('name’)]
#先取反再取布爾值真,即刪除name的重復(fù)行Out[5]:agename026Yubg185John264Jerry385Cd
In[6]:df.drop_duplicates('age’)#剔除age列中的重復(fù)行Out[6]:agename026Yubg185John264Jerry上面的df中索引為4的行屬于索引為1的重復(fù)行,去重后重復(fù)行索引為4的行被刪除。~表示取反,本例中所有為T(mén)rue的轉(zhuǎn)為False,而False轉(zhuǎn)化為T(mén)rue,再?gòu)牟紶栔道锾崛?shù)據(jù),即把為真的值提取出來(lái),相當(dāng)于對(duì)False(取反前為T(mén)rue的重復(fù)行)值刪除。2.缺失值處理從統(tǒng)計(jì)上說(shuō),缺失的數(shù)據(jù)可能會(huì)產(chǎn)生有偏估計(jì),從而使樣本數(shù)據(jù)不能很好地代表總體,而現(xiàn)實(shí)中絕大部分?jǐn)?shù)據(jù)都存在缺失值,因此如何處理缺失值很重要。一般說(shuō)來(lái),缺失值的處理包括兩個(gè)步驟,即缺失數(shù)據(jù)的識(shí)別和缺失值處理。(1)缺失數(shù)據(jù)的識(shí)別pandas使用浮點(diǎn)值NaN表示浮點(diǎn)和非浮點(diǎn)數(shù)組里的缺失數(shù)據(jù),并使用.isnull()和.notnull()函數(shù)來(lái)判斷缺失情況。In[1]:frompandasimportDataFramefrompandasimportread_exceldf=read_excel(r'C:\Users\yubg\rz.xlsx',sheet_name='Sheet3')dfOut[1]:
學(xué)號(hào)
班級(jí)
姓名性別
英語(yǔ)
體育
軍訓(xùn)
數(shù)分
高代
解幾0230802424123080242成龍
男767.87740.023.0601230802424423080242周怡
女669.17547.047.0442230802425123080242張波
男858.17545.045.060……8230802432623080243余皓
男666.78565.061.0719230802432023080243李嘉
女62作弊9060.067.07710230802420123080242遲培
男6058971.076.07111230802434223080243李上初
男7698460.066.06012230802431023080243郭竇
女796.78464.064.07913230802443523080244姜毅濤
男777.1缺考61.073.076……17230802443323080244李大強(qiáng)
男797.67778.0NaN7018230802442823080244李側(cè)通
男649.69169.060.07719230802440223080244王慧
女737.49370.071.07520230802442223080244李曉亮
男8568572.072.083In[2]:df.isnull().tail()Out[2]:
學(xué)號(hào)
班級(jí)
姓名
性別
英語(yǔ)
體育
軍訓(xùn)
數(shù)分
高代
解幾16FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse17FalseFalseFalseFalseFalseFalseFalseFalseTrueFalse18FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse19FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse20FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
In[3]:df.notnull()Out[3]:
學(xué)號(hào)
班級(jí)
姓名
性別
英語(yǔ)
體育
軍訓(xùn)
數(shù)分
高代
解幾0TrueTrueTrueTrueTrueTrueTrueTrueTrueTrue1TrueTrueTrueTrueTrueTrueTrueTrueTrueTrue2TrueTrueTrueTrueTrueTrueTrueTrueTrueTrue…12TrueTrueTrueTrueTrueTrueTrueTrueTrueTrue13TrueTrueTrueTrueTrueTrueTrueTrueTrueTrue14TrueTrueTrueTrueTrueTrueTrueTrueTrueTrue15TrueTrueTrueTrueTrueTrueTrueFalseTrueTrue16TrueTrueTrueTrueTrueTrueTrueTrueTrueTrue17TrueTrueTrueTrueTrueTrueTrueTrueFalseTrue18TrueTrueTrueTrueTrueTrueTrueTrueTrueTrue19TrueTrueTrueTrueTrueTrueTrueTrueTrueTrue20TrueTrueTrueTrueTrueTrueTrueTrueTrueTrue對(duì)于某列要顯示其空值所在的行,如“數(shù)分”列:df[df.數(shù)分.isnull()]要?jiǎng)h除這個(gè)空值行,可以使用drop()函數(shù),也可以使用:df[~df.數(shù)分.isnull()]~表示取反。(2)缺失數(shù)據(jù)的處理對(duì)于缺失數(shù)據(jù)的處理方式有數(shù)據(jù)填充、刪除對(duì)應(yīng)行、不處理等方法。1dropna():對(duì)數(shù)據(jù)結(jié)構(gòu)中有值為空的行進(jìn)行刪除刪除數(shù)據(jù)中有空值所對(duì)應(yīng)的行。In[4]:newDF=df.dropna()newDFOut[4]:
學(xué)號(hào)
班級(jí)
姓名性別
英語(yǔ)體育
軍訓(xùn)
數(shù)分高代
解幾0230802424123080242成龍
男767.87740.023.0601230802424423080242周怡
女669.17547.047.0442230802425123080242張波
男858.17545.045.0603230802424923080242朱浩
男6558072.062.0714230802421923080242封印
女738.89261.047.0465230802420123080242遲培
男6058971.076.0716230802434723080243李華
女676.18461.065.0787230802430723080243陳田
男767.98669.040.0698230802432623080243余皓
男666.78565.061.0719230802432023080243李嘉
女62作弊9060.067.07710230802420123080242遲培
男6058971.076.07111230802434223080243李上初
男7698460.066.06012230802431023080243郭竇
女796.78464.064.07913230802443523080244姜毅濤
男777.1缺考61.073.07614230802443223080244趙宇
男747.48868.070.07116230802442123080244林建祥
男727.28163.090.07518230802442823080244李側(cè)通
男649.69169.060.07719230802440223080244王慧
女737.49370.071.07520230802442223080244李曉亮
男8568572.072.083df中有NaN值的2、7行已經(jīng)被刪除。但可以指定參數(shù)how='all',表示只有行里的數(shù)據(jù)全部為空時(shí)才丟棄,如df.dropna(how='all')。如果想以同樣的方式按列丟棄,可以傳入axis=1,如df.dropna(how='all',axis=1)。2df.fillna():用其它數(shù)值填充NaN有時(shí)空值直接刪除會(huì)影響分析的結(jié)果,可以對(duì)空值進(jìn)行填補(bǔ)。如使用數(shù)值或者任意字符替代缺失值。In[5]:df.fillna('?')#用問(wèn)號(hào)填充空值Out[5]:
學(xué)號(hào)
班級(jí)
姓名
性別
英語(yǔ)
體育軍訓(xùn)數(shù)分
高代解幾0230802424123080242成龍
男767.87740.023.0601230802424423080242周怡
女669.17547.047.0442230802425123080242張波
男858.17545.045.0603230802424923080242朱浩
男6558072.062.0714230802421923080242封印
女738.89261.047.0465230802420123080242遲培
男6058971.076.0716230802434723080243李華
女676.18461.065.0787230802430723080243陳田
男767.98669.040.0698230802432623080243余皓
男666.78565.061.0719230802432023080243李嘉
女62作弊9060.067.07710230802420123080242遲培
男6058971.076.07111230802434223080243李上初
男7698460.066.06012230802431023080243郭竇
女796.78464.064.07913230802443523080244姜毅濤
男777.1缺考61.073.07614230802443223080244趙宇
男747.48868.070.07115230802444623080244周路
女76877?74.08016230802442123080244林建祥
男727.28163.090.07517230802443323080244李大強(qiáng)
男797.67778.0?7018230802442823080244李側(cè)通
男649.69169.060.07719230802440223080244王慧
女737.49370.071.07520230802442223080244李曉亮
男8568572.072.083如2、7行的空用“?”替代了缺失值。In[6]:df.fillna(method='pad')Out[6]:
學(xué)號(hào)
班級(jí)
姓名性別
英語(yǔ)
體育
軍訓(xùn)
數(shù)分
高代
解幾0230802424123080242成龍
男767.87740.023.0601230802424423080242周怡
女669.17547.047.044……8230802432623080243余皓
男666.78565.061.0719230802432023080243李嘉
女62作弊9060.067.07710230802420123080242遲培
男6058971.076.07111230802434223080243李上初
男7698460.066.06012230802431023080243郭竇
女796.78464.064.07913230802443523080244姜毅濤
男777.1缺考61.073.07614230802443223080244趙宇
男747.48868.070.07115230802444623080244周路
女7687768.074.08016230802442123080244林建祥
男727.28163.090.07517230802443323080244李大強(qiáng)
男797.67778.090.07018230802442823080244李側(cè)通
男649.69169.060.07719230802440223080244王慧
女737.49370.071.07520230802442223080244李曉亮
男8568572.072.083
3df.fillna(method='pad'):用前一個(gè)數(shù)據(jù)值替代NaN用前一個(gè)數(shù)據(jù)值替代當(dāng)前的缺失值。4df.fillna(method='bfill'):用后一個(gè)數(shù)據(jù)值替代NaN與pad相反,bfill表示用后一個(gè)數(shù)據(jù)代替NaN??梢杂胠imit限制每列可以替代NaN的數(shù)目。In[7]:df.fillna(method='bfill')Out[7]:
學(xué)號(hào)
班級(jí)
姓名性別
英語(yǔ)
體育
軍訓(xùn)數(shù)分
高代
解幾0230802424123080242成龍
男767.87740.023.0601230802424423080242周怡
女669.17547.047.0442230802425123080242張波
男858.17545.045.0603230802424923080242朱浩
男6558072.062.0714230802421923080242封印
女738.89261.047.0465230802420123080242遲培
男6058971.076.0716230802434723080243李華
女676.18461.065.0787230802430723080243陳田
男767.98669.040.0698230802432623080243余皓
男666.78565.061.0719230802432023080243李嘉
女62作弊9060.067.07710230802420123080242遲培
男6058971.076.07111230802434223080243李上初
男7698460.066.06012230802431023080243郭竇
女796.78464.064.07913230802443523080244姜毅濤
男777.1缺考61.073.07614230802443223080244趙宇
男747.48868.070.07115230802444623080244周路
女7687763.074.08016230802442123080244林建祥
男727.28163.090.07517230802443323080244李大強(qiáng)
男797.67778.060.07018230802442823080244李側(cè)通
男649.69169.060.07719230802440223080244王慧
女737.49370.071.07520230802442223080244李曉亮
男8568572.072.0835df.fillna(df.mean()):用平均數(shù)或者其它描述性統(tǒng)計(jì)量來(lái)代替NaN使用均值來(lái)填補(bǔ)空數(shù)據(jù)。
In[8]:df.fillna(df["數(shù)分"].mean())Out[8]:
學(xué)號(hào)
班級(jí)
姓名性別
英語(yǔ)
體育
軍訓(xùn)
數(shù)分
高代
解幾0230802424123080242成龍
男767.87740.0023.00601230802424423080242周怡
女669.17547.0047.00442230802425123080242張波
男858.17545.0045.0060…8230802432623080243余皓
男666.78565.0061.00719230802432023080243李嘉
女62作弊9060.0067.007710230802420123080242遲培
男6058971.0076.007111230802434223080243李上初
男7698460.0066.006012230802431023080243郭竇
女796.78464.0064.007913230802443523080244姜毅濤
男777.1缺考61.0073.007614230802443223080244趙宇
男747.48868.0070.007115230802444623080244周路
女7687763.3574.008016230802442123080244林建祥
男727.28163.0090.007517230802443323080244李大強(qiáng)
男797.67778.0063.357018230802442823080244李側(cè)通
男649.69169.0060.007719230802440223080244王慧
女737.49370.0071.007520230802442223080244李曉亮
男8568572.0072.0083“數(shù)分”列中有一個(gè)空值,剩余的均值為63.35,故以63.35替代。6df.fillna({'列名1':值1,'列名2':值2}):可以傳入一個(gè)字典,對(duì)不同的列填充不同的值為不同的列填充不同的值來(lái)填補(bǔ)空數(shù)據(jù)。In[10]:df.fillna({'數(shù)分':100,'高代':0})Out[10]:
學(xué)號(hào)
班級(jí)
姓名性別
英語(yǔ)
體育
軍訓(xùn)
數(shù)分
高代
解幾0230802424123080242成龍
男767.87740.023.0601230802424423080242周怡
女669.17547.047.044…8230802432623080243余皓
男666.78565.061.0719230802432023080243李嘉
女62作弊9060.067.07710230802420123080242遲培
男6058971.076.07111230802434223080243李上初
男7698460.066.06012230802431023080243郭竇
女796.78464.064.07913230802443523080244姜毅濤
男777.1缺考61.073.07614230802443223080244趙宇
男747.48868.070.07115230802444623080244周路
女76877100.074.08016230802442123080244林建祥
男727.28163.090.07517230802443323080244李大強(qiáng)
男797.67778.00.07018230802442823080244李側(cè)通
男649.69169.060.07719230802440223080244王慧
女737.49370.071.07520230802442223080244李曉亮
男8568572.072.083“數(shù)分”列填充值為100,“高代”列填充值為0。7strip():清除字符型數(shù)據(jù)左右(首尾)指定的字符,默認(rèn)為空格刪除字符串左右兩側(cè)或首尾指定的空格。In[11]:frompandasimportDataFrame...:frompandasimportSeries...:df=DataFrame({'age':Series([26,85,64,85,85]),...:'name':Series(['Ben’,...:'John','Jerry','John','John'])})...:dfOut[11]:agename026Ben185John264Jerry385John485John
In[12]:df['name'].str.strip()Out[12]:0Ben1John2Jerry3John4JohnName:name,dtype:object如果要?jiǎng)h除右邊的則df['name'].str.rstrip(),刪除左邊的df['name'].str.lstrip(),默認(rèn)為刪除空格,也可以帶參數(shù),如刪除右邊的“n”:In[13]:df['name'].str.rstrip('n')Out[13]:0Be1John2Jerry3John4JohName:name,dtype:object在做異常處理時(shí),有些數(shù)據(jù)可能會(huì)出現(xiàn)數(shù)據(jù)格式不同,如成績(jī)表中某列記錄的是分?jǐn)?shù),應(yīng)該是數(shù)值型的數(shù)據(jù),但是其中有一行數(shù)據(jù)填寫(xiě)的是“缺考”或者“作弊”,這時(shí)候如果要對(duì)數(shù)據(jù)做均分計(jì)算就會(huì)出錯(cuò)。此時(shí)我們需要對(duì)數(shù)據(jù)做一個(gè)數(shù)據(jù)檢測(cè),包括對(duì)數(shù)據(jù)各行或者各列看看數(shù)據(jù)格式是否統(tǒng)一,如是否均為數(shù)據(jù)型或者字符型,又或者顯示為object。In[1]:frompandasimportread_excel...:df=read_excel(r'd:\python\i_nuc.xlsx',sheet_name='Sheet3')
In[2]:df.loc[9:14]#顯示索引號(hào)9到14行數(shù)據(jù)Out[2]:
學(xué)號(hào)
班級(jí)
姓名性別
英語(yǔ)
體育
軍訓(xùn)
數(shù)分
高代
解幾9230802432023080243李嘉
女62作弊9060.067.07710230802420123080242遲培
男6058971.076.07111230802434223080243李上初
男7698460.066.06012230802431023080243郭竇
女796.78464.064.07913230802443523080244姜毅濤
男777.1缺考61.073.07614230802443223080244趙宇
男747.48868.070.071
In[3]:()#查看數(shù)據(jù)整體情況<class'pandas.core.frame.DataFrame'>RangeIndex:21entries,0to20Datacolumns(total10columns):#ColumnNon-NullCountDtype----------------------------0學(xué)號(hào)21non-nullint641班級(jí)21non-nullint642姓名21non-nullobject3性別21non-nullobject4英語(yǔ)21non-nullint645體育21non-nullobject6軍訓(xùn)21non-nullobject7數(shù)分20non-nullfloat648高代20non-nullfloat649解幾21non-nullint64dtypes:float64(2),int64(4),object(4)memoryusage:1.8+KB7.1.2數(shù)據(jù)標(biāo)準(zhǔn)化在數(shù)據(jù)分析之前,有些數(shù)據(jù)我們通常需要先將其標(biāo)準(zhǔn)化hormalization),利用標(biāo)準(zhǔn)化后的數(shù)據(jù)進(jìn)行分析。數(shù)據(jù)的標(biāo)準(zhǔn)化(normalization)是將數(shù)據(jù)按比例縮放,使之落入一個(gè)小的特定區(qū)間。在某些比較和評(píng)價(jià)的指標(biāo)處理中經(jīng)常會(huì)用到,去除數(shù)據(jù)的單位限制,將其轉(zhuǎn)化為無(wú)量綱的純數(shù)值,便于不同單位或量級(jí)的指標(biāo)能夠進(jìn)行比較和加權(quán)。數(shù)據(jù)標(biāo)準(zhǔn)化的方法有很多種,常用的有“最小-大標(biāo)準(zhǔn)化”、“Z-score標(biāo)準(zhǔn)化”和“按小數(shù)定標(biāo)標(biāo)準(zhǔn)化”等。經(jīng)過(guò)上述標(biāo)準(zhǔn)化處理,原始數(shù)據(jù)均轉(zhuǎn)換為無(wú)量綱化指標(biāo)測(cè)評(píng)值,即各指標(biāo)值都處于同一個(gè)數(shù)量級(jí)別上,可以進(jìn)行綜合測(cè)評(píng)分析。1.min-max標(biāo)準(zhǔn)化min-max標(biāo)準(zhǔn)化(Min-maxnormalization),又名離差標(biāo)準(zhǔn)化,是對(duì)原始數(shù)據(jù)的線性變換,使結(jié)果映射到[0,1]區(qū)間且無(wú)量綱。公式如下:X*=(x-min)/(max-min)max:樣本最大值;min:樣本最小值。當(dāng)有新數(shù)據(jù)加入時(shí)需要重新進(jìn)行數(shù)據(jù)歸一化。In[1]:frompandasimportread_excel...:df=read_excel(r'C:\Users\yubg\i_nuc.xls',sheetname='Sheet7’)...:df.head()Out[1]:
學(xué)號(hào)
班級(jí)
姓名性別
英語(yǔ)
體育
軍訓(xùn)
數(shù)分
高代
解幾0230802424123080242成龍
男7678774023601230802424423080242周怡
女6691754747442230802425123080242張波
男8581754545603230802424923080242朱浩
男6550807262714230802421923080242封印
女738892614746
In[2]:scale=(df.數(shù)分.astype(int)-df.數(shù)分.astype(int).min())/(...:df.數(shù)分.astype(int).max()-df.數(shù)分.astype(int).min())...:scale.head()Out[2]:00.00000010.18421120.13157930.84210540.552632Name:數(shù)分,dtype:float64
2.Z-score標(biāo)準(zhǔn)化方法這種方法給予原始數(shù)據(jù)的均值(mean)和標(biāo)準(zhǔn)差(standarddeviation)進(jìn)行數(shù)據(jù)的標(biāo)準(zhǔn)化。經(jīng)過(guò)處理的數(shù)據(jù)符合標(biāo)準(zhǔn)正態(tài)分布,即均值為0,標(biāo)準(zhǔn)差為1,轉(zhuǎn)化函數(shù)為:X*=(x-μ)/σ其中μ為所有樣本數(shù)據(jù)的均值,σ為所有樣本數(shù)據(jù)的標(biāo)準(zhǔn)差。將數(shù)據(jù)按其屬性(按列進(jìn)行)減去其均值,并除以其標(biāo)準(zhǔn)差。得到的結(jié)果是,對(duì)于每個(gè)屬性(每列)來(lái)說(shuō)所有數(shù)據(jù)都聚集在0附近,標(biāo)準(zhǔn)差為1。z-score標(biāo)準(zhǔn)化方法適用于屬性A的最大值和最小值未知的情況,或有超出取值范圍的離群數(shù)據(jù)的情況。標(biāo)準(zhǔn)化后的變量值圍繞0上下波動(dòng),大于0說(shuō)明高于平均水平,小于0說(shuō)明低于平均水平。使用sklearn.preprocessing.scale()函數(shù),可以直接將給定數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化:In[3]:fromsklearnimportpreprocessing...:importnumpyasnp
...:df1=df['數(shù)分']...:df_scaled=preprocessing.scale(df1)...:df_scaledOut[3]:array([-2.50457384,-1.75012229,-1.96567988,0.94434751,-0.2412192,0.83656872,-0.2412192,0.62101114,0.18989597,-0.34899799,-0.34899799,0.08211717,-0.2412192,0.51323234,-0.2412192,-0.02566162,1.59102027,0.62101114,0.72878993,0.94434751,0.83656872])7.1.3數(shù)據(jù)運(yùn)算通過(guò)對(duì)各字段進(jìn)行加、減、乘、除等四則算術(shù)運(yùn)算,計(jì)算出的結(jié)果作為新的字段,如表7-1所示。表7-1字段之間的運(yùn)算結(jié)果作為新的字段In[1]:frompandasimportread_excel...:df=read_excel(r'c:\Users\yubg\i_nuc.xls',sheetname='Sheet7’)...:df.head()Out[1]:
學(xué)號(hào)
班級(jí)
姓名性別
英語(yǔ)
體育
軍訓(xùn)
數(shù)分
高代
解幾0230802424123080242成龍
男7678774023601230802424423080242周怡
女6691754747442230802425123080242張波
男8581754545603230802424923080242朱浩
男6550807262714230802421923080242封印
女738892614746In[1]:jj=df['解幾'].astype(int)#將df中的“解幾”轉(zhuǎn)化為int類型...:gd=df['高代'].astype(int)
...:df['數(shù)分+解幾']=jj+gd#在df中新增“數(shù)分+解幾”列,值為:jj+gd...:df.head()Out[112]:
學(xué)號(hào)
班級(jí)
姓名性別
英語(yǔ)
體育
軍訓(xùn)
數(shù)分
高代
解幾
數(shù)分+解幾0230802424123080242成龍
男767877402360831230802424423080242周怡
女669175474744912230802425123080242張波
男8581754545601053230802424923080242朱浩
男6550807262711334230802421923080242封印
女73889261474693對(duì)列的數(shù)據(jù)類型進(jìn)行轉(zhuǎn)化也可以使用map()和apply()。jj=df['解幾'].map(str)#將df中的“解幾”轉(zhuǎn)化為str類型gd=df['高代'].apply(float)#將df中的“高代”轉(zhuǎn)化為float類型7.1.4日期處理數(shù)據(jù)處理時(shí)常常會(huì)遇到對(duì)日期時(shí)間格式進(jìn)行處理,以及對(duì)時(shí)間進(jìn)行運(yùn)算等。1.日期轉(zhuǎn)換將字符型的日期格式轉(zhuǎn)換為日期格式數(shù)據(jù)的過(guò)程。to_datetime(dateString,format) format格式:%Y:年份%m:月份%d:日期%H:小時(shí)%M:分鐘%S:秒如to_datetime(df.注冊(cè)時(shí)間,format=’%Y/%m/%d’)。In[1]:frompandasimportto_datetime...:frompandasimportread_excel...:df=read_excel(r'd:\OneDrive\i_nuc.xlsx',sheet_name='Sheet9')...:dfOut[1]:numpriceyearmonthdate0123159201612016-06-011124753201622016-06-022125456201632016-06-033126852201642016-06-044127210201652016-06-055115299201662016-06-066102699201672016-06-077201599201682016-06-088154199201692016-06-0991428992016102016-06-10In[2]:df_dt=to_datetime(df.date,format="%Y/%m/%d")...:df_dtOut[2]:02016-06-0112016-06-0222016-06-0332016-06-0442016-06-0552016-06-0662016-06-0772016-06-0882016-06-0992016-06-10Name:date,dtype:datetime64[ns]2.日期格式化將日期型的數(shù)據(jù)按照給定的格式轉(zhuǎn)化為字符型的數(shù)據(jù)。datetime.strftime(x,format)如日期型數(shù)據(jù)轉(zhuǎn)化為字符型數(shù)據(jù)。In[1]:frompandasimportread_excel...:frompandasimportto_datetime...:fromdatetimeimportdatetime
In[2]:df_dt_str=df_dt.apply(lambdax:datetime.strftime(x,"%Y/%m/%d"))...:df_dt_strOut[2]:02016/06/0112016/06/0222016/06/0332016/06/0442016/06/0552016/06/0662016/06/0772016/06/0882016/06/0992016/06/10Name:date,dtype:object注意:當(dāng)希望將函數(shù)f應(yīng)用到數(shù)據(jù)框?qū)ο蟮男谢蛄袝r(shí),可以使用.apply(f,axis=0,args=(),**kwds)方法,axis=0表示按列運(yùn)算,axis=1時(shí)表示按行運(yùn)算。如:In[3]:frompandasimportDataFrame...:df=DataFrame({'ohio':[1,3,6],'texas':[1,4,5],'calif':[2,5,8]},index=['a','c','d'])...:dfOut[3]:ohiotexascalifa112c345d658
In[4]:f=lambdax:x.max()-x.min()...:df.apply(f)#默認(rèn)按列運(yùn)算,同df.apply(f,axis=0)Out[4]:ohio5texas4calif6dtype:int64
In[5]:df.apply(f,axis=1)#按行運(yùn)算Out[5]:a1c2d3dtype:int643.日期抽取是指從日期格式里面抽取出需要的部分屬性。Data_pertysecond1-60秒,從1開(kāi)始到60minute1-60分,從1開(kāi)始到60hour1-24小時(shí),從1開(kāi)始到24day1-31日,一個(gè)月中第幾天,從1開(kāi)始到31month1-12月,從1開(kāi)始到12year年份weekday1-7,一周中的第幾天,從1開(kāi)始,最大為7如對(duì)日期進(jìn)行抽取。In[6]:df_dt.dt.yearOut[6]:02016120162201632016420165201662016720168201692016Name:date,dtype:int32In[7]:df_dt.dt.dayOut[7]:011223344556677889910Name:date,dtype:int32其他的時(shí)間格式提?。篸f_dt.dt.monthdf_dt.dt.weekdaydf_dt.dt.seconddf_dt.dt.hour4.日期運(yùn)算datetime模塊下有timedelta()函數(shù),可以在日期上進(jìn)行加減,如在當(dāng)前的日期上加上3天,函數(shù)會(huì)自動(dòng)給出3天后的日期。In[8]:importdatetime...:[datetime.datetime.strftime(i+datetime.timedelta(3),"%Y/%m/%d")foriindf_dt]#在當(dāng)天的天數(shù)上邊加上3天.Out[8]:['2016/06/04','2016/06/05','2016/06/06','2016/06/07','2016/06/08','2016/06/09','2016/06/10','2016/06/11','2016/06/12','2016/06/13']In[9]:importdatetime...:t=[]...:foriindf_dt:...:d=i+datetime.timedelta(3)...:dd=datetime.datetime.strftime(d,"%Y/%m/%d")...:t.append(dd)...:tOut[9]:['2016/06/04','2016/06/05','2016/06/06','2016/06/07','2016/06/08','2016/06/09','2016/06/10','2016/06/11','2016/06/12','2016/06/13']這里用到了列表推導(dǎo)式,也可以分步實(shí)現(xiàn)。7.1.5其他操作1、map、apply的使用
將數(shù)據(jù)框中性別列對(duì)應(yīng)的男女替換成1和0,并做成新的列。In[1]:importpandasaspd...:d={"gender":["male","female","male","female"],...:"color":["red","green","blue","green"],...:"age":[25,30,15,32]}...:...:df=pd.DataFrame(d)...:dfOut[1]:gendercolorage0malered251femalegreen302maleblue153femalegreen32In[2]:d={"male":0,"female":1}
...:df["gender2"]=df["gender"].map(d)
In[3]:dfOut[3]:gendercoloragegender20malered2501femalegreen3012maleblue1503femalegreen321在gender列上,使用map方法,快速完成如下映射:上面的操作也可以通過(guò)apply來(lái)實(shí)現(xiàn)。In[4]:df["mal_n"]=df.gender.apply(lambdax:1ifx=="male"else0)
...:dfOut[4]:gendercoloragemal_n0malered2511femalegreen3002maleblue1513femalegreen320還也可以寫(xiě)成以下的函數(shù):defpd_column_modify_value(df,col,dic):"""
對(duì)某列的某個(gè)值進(jìn)行統(tǒng)一修改。
對(duì)df數(shù)據(jù)的col列按照字典dic進(jìn)行對(duì)應(yīng)替換值"""df["name_"]=[""]*len(df)df["name_"]=df[col].map(dic)returndfIn[5]:importpandasaspd...:importnumpyasnp...:defpd_column_modify_value(df,col,dic):...:"""...:對(duì)某列的某個(gè)值進(jìn)行統(tǒng)一修改。...:對(duì)df數(shù)據(jù)的col列按照字典dic進(jìn)行對(duì)應(yīng)替換值...:"""...:df["name_"]=[""]*len(df)...:df["name_"]=df[col].map(dic)...:returndfIn[6]:df=pd.DataFrame(np.random.randint(1,10,size=(5,2)),columns=['A','B'])...:dfOut[6]:AB035177244312444
In[7]:nw={5:0,2:"?"}...:pd_column_modify_value(df,"B",nw)Out[7]:ABname_0350177NaN244NaN312?444NaN2、replace和正則清洗數(shù)據(jù)在某列上使用replace方法和正則,快速完成值的清洗。先創(chuàng)建個(gè)數(shù)據(jù)框df。In[8]:d={"customer":["A","B","C","D"],
...:"sales":[1100,"950.5RMB","$400","$1250.75"]}...:...:df=pd.DataFrame(d)...:dfOut[8]:customersales0A 11001B 950.5RMB2C $4003D $1250.75目標(biāo)是清洗掉RMB、$符號(hào),轉(zhuǎn)化這一列為浮點(diǎn)型。使用正則替換,將要替換的字符放到列表中[$,RMB],替換為空字符,即"";最后使用astype轉(zhuǎn)為float。使用正則表達(dá)式時(shí)記得后面加regex=True參數(shù),表示使用正則表達(dá)式。In[9]:df["sales"]=df["sales"].replace("[$,RMB]","",regex=True).astype("float")
In[10]:dfOut[10]:customersales0A1100.001B950.502C400.003D1250.75
3、將分類中出現(xiàn)次數(shù)較少的值歸為others先創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)d。In[11]:d={"name":['Jone','Alica','Emily','Robert','Tomas',
...:'Zhang','Liu','Wang','Jack','Wsx','Guo'],
...:"categories":["A","C","A","D","A",
...:"B","B","C","A","E","F"]}
...:df=pd.DataFrame(d)
...:dfOut[11]:namecategories0JoneA1AlicaC2EmilyA3RobertD4TomasA5ZhangB6LiuB7WangC8JackA9WsxE10GuoFd中的D、E、F僅在分類中出現(xiàn)一次,A出現(xiàn)次數(shù)較多,將D、E、F歸為other類。In[12]:frequencies=df["categories"].value_counts(normalize=True)
...:frequenciesOut[12]:A0.363636C0.181818B0.181818E0.090909D0.090909F0.090909Name:categories,dtype:float64步驟1:統(tǒng)計(jì)頻次,并歸一In[13]:threshold=0.1
...:small_categories=frequencies[frequencies<threshold].index
...:small_categoriesOut[13]:Index(['E','D','F'],dtype='object')步驟2:設(shè)定閾值,過(guò)濾出頻次較少的值In[14]:df["categories"]=df["categories"].replace(small_categories,"Others")
In[15]:df["categories"]Out[15]:0A1C2A3Others4A5B6B7C8A9Others10OthersName:categories,dtype:object步驟3:替換值也可以對(duì)out[12]的結(jié)果frequencies做另外一種有意思的操作:低于0.1的則取0.18,高于0.2的則取0.2。defget_value(value,max_value,min_value):ifvalue>max_value:value=max_valueifvalue<min_value:value=min_valuereturnvalue
frequencies.apply(get_value,args=(0.2,0.18))思路如下:先自定義一個(gè)函數(shù)判斷函數(shù)的值是否符合上述的規(guī)則;再將這個(gè)自定義函數(shù)應(yīng)用到這個(gè)一列上去。7.2數(shù)據(jù)分析數(shù)據(jù)分析離不開(kāi)Python的Numpy、Pandas和Scipy等常用分析工具,并結(jié)合常用的統(tǒng)計(jì)量來(lái)進(jìn)行數(shù)據(jù)的描述,把數(shù)據(jù)的特征和內(nèi)在結(jié)構(gòu)展現(xiàn)出來(lái)。7.2.1基本統(tǒng)計(jì)基本統(tǒng)計(jì)分析又叫描述性統(tǒng)計(jì)分析。一般統(tǒng)計(jì)某個(gè)變量的最小值、第一個(gè)四分位值、中值、第三個(gè)四分位值、最大值和均值。描述性統(tǒng)計(jì)分析函數(shù)為describe()。其返回值是均值、標(biāo)準(zhǔn)差、最大值、最小值、分位數(shù)等。括號(hào)中可以帶一些參數(shù),例如
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年住宅小區(qū)智能化保安巡邏服務(wù)合同2篇
- 二零二五年度專業(yè)社保代繳機(jī)構(gòu)合作協(xié)議2篇
- 2025年度新能源加油站油品供應(yīng)及維護(hù)服務(wù)合同3篇
- 承德護(hù)理職業(yè)學(xué)院《區(qū)域分析方法》2023-2024學(xué)年第一學(xué)期期末試卷
- 成都藝術(shù)職業(yè)大學(xué)《科技英語(yǔ)(精細(xì)化工)》2023-2024學(xué)年第一學(xué)期期末試卷
- 隧道注漿施工方案
- 2025版酒店資產(chǎn)租賃及經(jīng)營(yíng)管理一體化合同3篇
- 2024年第三方支付服務(wù)合同
- 二零二五年出口貨運(yùn)代理與多國(guó)貿(mào)易通行合同3篇
- 2024年版房屋買(mǎi)賣(mài)合同模板
- 心電圖基本知識(shí)PPT
- 車輛維修突發(fā)事件應(yīng)急處置預(yù)案
- YY 9706.210-2021醫(yī)用電氣設(shè)備第2-10部分:神經(jīng)和肌肉刺激器的基本安全和基本性能專用要求
- GB/T 5130-1997電氣用熱固性樹(shù)脂工業(yè)硬質(zhì)層壓板試驗(yàn)方法
- FZ/T 01041-2014絨毛織物絨毛長(zhǎng)度和絨毛高度的測(cè)定
- 《經(jīng)濟(jì)學(xué)導(dǎo)論》考試復(fù)習(xí)題庫(kù)(含答案)
- 農(nóng)田水利渠道灌溉與排水課件
- 六棱塊護(hù)坡施工方案
- 機(jī)械制圖課件(完整版)
- 《行政組織學(xué)小抄》word版
- (完整版)環(huán)境科學(xué)與工程-專業(yè)英語(yǔ)詞匯必備(免費(fèi))
評(píng)論
0/150
提交評(píng)論