關(guān)于Python數(shù)據(jù)處理中的None、NULL和NaN的理解與應(yīng)用
一、python中None、null和NaN
注意:python中沒有null,只有和其意義相近的None。
1、None
1)數(shù)據(jù)類型
None表示空值,一個(gè)特殊Python對(duì)象,None的類型是NoneType。
None是NoneType數(shù)據(jù)類型的唯一值,我們不能創(chuàng)建其它NoneType類型的變量,但是可以將None賦值給任何變量。
type(None) #該值是一個(gè)空對(duì)象,空值是python里面一個(gè)特殊的值,用None表示。None不能理解為0,因?yàn)?是有意義,而None是一個(gè)特殊的空值。 type('')
2)特征:
- None不支持任何運(yùn)算
- None和任何其他數(shù)據(jù)類型比較永遠(yuǎn)返回False
- None有自己的數(shù)據(jù)類型NoneType,不能創(chuàng)建其他NoneType對(duì)象。(它只有一個(gè)值None)
- None與0、空列表、空字符串不一樣。
- None賦值給任何變量,也可以給None值變量賦值
- None沒有像len、size等屬性,要判斷一個(gè)變量是否為None,直接使用。
None==0 None==‘' None==False dir(None) #返回參數(shù)屬性、方法列表
3)作為沒有return關(guān)鍵函數(shù)的返回值
對(duì)于所有沒有return語句的函數(shù)定義,python都會(huì)在末尾加上return None,使用不帶值的return語句(也就是只有return關(guān)鍵字本身),那么就返回None。
def fun1(): print('test') result=fun() print(result)
2、NaN
1)當(dāng)使用Numpy或者Pandas處理數(shù)據(jù)的時(shí)候,會(huì)自動(dòng)將條目中沒有數(shù)據(jù)轉(zhuǎn)換為NaN。
import pandas as pd df=pd.read_csv('F:\\python_test\\demo.csv',header=None) print(df)
原數(shù)據(jù)為下圖:
2)特征
- NaN是沒有辦法和任何數(shù)據(jù)進(jìn)行比較
- 它和任何值都不相等,包括他自己。
- 它的數(shù)類型是float,但是和任何值做計(jì)算的結(jié)果都是NaN
frame= pd.DataFrame([[1, 2, 3], [2, 3, 4], [3, 4, np.nan]], index=list('abc'), columns=list('ABC')) num=frame.iloc[2,2] result=num+2 result
二、實(shí)際應(yīng)用
1、使用read_sql讀取null數(shù)據(jù)顯示NaN
使用hive進(jìn)行數(shù)據(jù)清洗、特征處理后,用python讀取hive數(shù)據(jù)庫下的整理好的表。
一般使用pyhive連續(xù)數(shù)據(jù)庫,pandas讀取數(shù)據(jù)。
pandas讀取hive數(shù)據(jù)庫下面的數(shù)據(jù)表
1、如果數(shù)據(jù)表字段為string格式,pandas讀取后在python中該字段數(shù)據(jù)格式為object,如果該字段中含有 NULL 值,讀取會(huì)直接轉(zhuǎn)換成字符串** ‘NULL’ **,如果該字段中含有’'(空值),讀取直接轉(zhuǎn)換成字符串 ** ‘’ **。
2、如果數(shù)據(jù)表字段為int格式,pandas讀取后在python中該字段數(shù)據(jù)格式為float64,如果該字段中含有 NULL 值或者 ‘’(空值),讀取直接轉(zhuǎn)換成字符串 NaN。
如果數(shù)據(jù)庫表的字段為string,字段中含NULL,多數(shù)意義就是默認(rèn)為空值或者異常數(shù)值,使用pd.DataFrame或者read_sql()讀取,默認(rèn)為字符串‘NULL’。
因此對(duì)此進(jìn)行數(shù)值處理會(huì)導(dǎo)致很多報(bào)錯(cuò)(比如ValueError: could not convert string to float: ‘NULL’),比如想要在python轉(zhuǎn)換數(shù)據(jù)類型的時(shí)候,或者想要對(duì)null進(jìn)行缺失值填充等等。
因此想要將“NULL”轉(zhuǎn)換成“NaN”,后續(xù)更加方便。
from pyhive import hive import pandas as pd import numpy as np #缺失值統(tǒng)計(jì) def na_count(data): data_count=data.count() na_count=len(data)-data_count na_rate=na_count/len(data) na_result=pd.concat([data_count,na_count,na_rate],axis=1) return na_result sql='''select is_vice_card,online_days,age,payment_type ,star_level_int,cert_cnt,channel_nbr,payment_method_variable,package_price_group,white_flag from database.v1_6_501_train_test''' con=hive.connect(host='b1m6.hdp.dc',port=10000,auth='KERBEROS',kerberos_service_name="hive") cursor=con.cursor() cursor.execute(sql) #執(zhí)行sql result=cursor.fetchall() data_pos_1=pd.DataFrame(result,columns=['is_vice_card', 'online_days', 'calling_cnt', 'age', 'payment_type', 'star_level_int', 'cert_cnt', 'channel_nbr', 'payment_method_variable', 'package_price_group']) print("未將‘NULL'替換成np.nan,查看train_data的缺失值:\n",na_count(data_pos_1)) #將str字段中的null轉(zhuǎn)換成空值 data_pos_1.loc[data_pos_1['is_vice_card']=='NULL','is_vice_card'] = np.nan data_pos_1.loc[data_pos_1['online_days']=='NULL','online_days'] = np.nan data_pos_1.loc[data_pos_1['age']=='NULL','age'] = np.nan data_pos_1.loc[data_pos_1['payment_type']=='NULL','payment_type'] = np.nan data_pos_1.loc[data_pos_1['star_level_int']=='NULL','star_level_int'] = np.nan data_pos_1.loc[data_pos_1['cert_cnt']=='NULL','cert_cnt'] = np.nan data_pos_1.loc[data_pos_1['channel_nbr']=='NULL','channel_nbr'] = np.nan data_pos_1.loc[data_pos_1['payment_method_variable']=='NULL','payment_method_variable'] = np.nan data_pos_1.loc[data_pos_1['package_price_group']=='NULL','package_price_group'] = np.nan print("將‘NULL'替換成np.nan,查看train_data的缺失值:\n",na_count(data_pos_1))
運(yùn)行代碼,結(jié)果顯示:
查看未將“NULL”替換成np.nan,data_pos_1的缺失值:
0 1 2
is_vice_card 8289 0 0.0
online_days 8289 0 0.0
calling_cnt 8289 0 0.0
age 8289 0 0.0
payment_type 8289 0 0.0
star_level_int 8289 0 0.0
cert_cnt 8289 0 0.0
channel_nbr 8289 0 0.0
payment_method_variable 8289 0 0.0
package_price_group 8289 0 0.0
查看將“NULL”替換成np.nan,data_pos_1的缺失值:;
0 1 2
is_vice_card 7854 435 0.052479
online_days 7854 435 0.052479
calling_cnt 8289 0 0.000000
age 7854 435 0.052479
payment_type 7854 435 0.052479
star_level_int 7830 459 0.055375
cert_cnt 6134 2155 0.259983
channel_nbr 7847 442 0.053324
payment_method_variable 7890 399 0.048136
package_price_group 8289 0 0.000000
也可以在數(shù)據(jù)庫表建立將字段設(shè)置為int。
2、使用read_csv讀取null數(shù)據(jù)顯示為字符串null
一般默認(rèn)為NaN
import pandas as pd data_pos=pd.read_csv(file_pos,encoding='utf-8') data_pos.head(10)
顯示為字符串為null
import pandas as pd data_pos=pd.read_csv(file_pos,encoding='utf-8', na_filter=False) #或 data_pos=pd.read_csv(file_pos,encoding='utf-8', keep_default_na=False) #查看data_pos數(shù)據(jù)格式 data_pos[data_pos['online_days']=='NULL'].head(10)
到此這篇關(guān)于關(guān)于Python數(shù)據(jù)處理中的None、NULL和NaN的理解與應(yīng)用的文章就介紹到這了,更多相關(guān)Python數(shù)據(jù)處理中的空值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談tensorflow中幾個(gè)隨機(jī)函數(shù)的用法
今天小編就為大家分享一篇淺談tensorflow中幾個(gè)隨機(jī)函數(shù)的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07python使用if語句實(shí)現(xiàn)一個(gè)猜拳游戲詳解
這篇文章主要介紹了python使用if語句實(shí)現(xiàn)一個(gè)猜拳游戲詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Python Opencv實(shí)現(xiàn)圖像輪廓識(shí)別功能
這篇文章主要為大家詳細(xì)介紹了Python Opencv實(shí)現(xiàn)圖像輪廓識(shí)別功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04keras load model時(shí)出現(xiàn)Missing Layer錯(cuò)誤的解決方式
這篇文章主要介紹了keras load model時(shí)出現(xiàn)Missing Layer錯(cuò)誤的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06TensorFlow安裝并在Pycharm搭建環(huán)境的詳細(xì)圖文教程
今天動(dòng)手開始搭建TensorFlow開發(fā)環(huán)境,所以下面這篇文章主要給大家介紹了關(guān)于TensorFlow安裝并在Pycharm搭建環(huán)境的詳細(xì)圖文教程,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11Django應(yīng)用程序中如何發(fā)送電子郵件詳解
我們常常會(huì)用到一些發(fā)送郵件的功能,比如有人提交了應(yīng)聘的表單,可以向HR的郵箱發(fā)郵件,這樣,HR不看網(wǎng)站就可以知道有人在網(wǎng)站上提交了應(yīng)聘信息。下面這篇文章就介紹了在Django應(yīng)用程序中如何發(fā)送電子郵件的相關(guān)資料,需要的朋友可以參考借鑒。2017-02-02