關(guān)于Python數(shù)據(jù)處理中的None、NULL和NaN的理解與應(yīng)用
一、python中None、null和NaN
注意:python中沒(méi)有null,只有和其意義相近的None。
1、None
1)數(shù)據(jù)類(lèi)型
None表示空值,一個(gè)特殊Python對(duì)象,None的類(lèi)型是NoneType。
None是NoneType數(shù)據(jù)類(lèi)型的唯一值,我們不能創(chuàng)建其它NoneType類(lèi)型的變量,但是可以將None賦值給任何變量。
type(None) #該值是一個(gè)空對(duì)象,空值是python里面一個(gè)特殊的值,用None表示。None不能理解為0,因?yàn)?是有意義,而None是一個(gè)特殊的空值。
type('')
2)特征:
- None不支持任何運(yùn)算
- None和任何其他數(shù)據(jù)類(lèi)型比較永遠(yuǎn)返回False
- None有自己的數(shù)據(jù)類(lèi)型NoneType,不能創(chuàng)建其他NoneType對(duì)象。(它只有一個(gè)值None)
- None與0、空列表、空字符串不一樣。
- None賦值給任何變量,也可以給None值變量賦值
- None沒(méi)有像len、size等屬性,要判斷一個(gè)變量是否為None,直接使用。
None==0 None==‘' None==False dir(None) #返回參數(shù)屬性、方法列表

3)作為沒(méi)有return關(guān)鍵函數(shù)的返回值
對(duì)于所有沒(méi)有return語(yǔ)句的函數(shù)定義,python都會(huì)在末尾加上return None,使用不帶值的return語(yǔ)句(也就是只有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)將條目中沒(méi)有數(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是沒(méi)有辦法和任何數(shù)據(jù)進(jìn)行比較
- 它和任何值都不相等,包括他自己。
- 它的數(shù)類(lèi)型是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ù)庫(kù)下的整理好的表。
一般使用pyhive連續(xù)數(shù)據(jù)庫(kù),pandas讀取數(shù)據(jù)。
pandas讀取hive數(shù)據(jù)庫(kù)下面的數(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ù)庫(kù)表的字段為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ù)類(lèi)型的時(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ù)庫(kù)表建立將字段設(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)文章
python神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)使用Keras進(jìn)行回歸運(yùn)算
這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)使用Keras進(jìn)行回歸運(yùn)算,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
使用Python進(jìn)行數(shù)獨(dú)求解詳解(一)
本文主要介紹了如何構(gòu)建一個(gè)Python腳本來(lái)解決數(shù)獨(dú)難題,本文的重點(diǎn)在于介紹用于構(gòu)建數(shù)獨(dú)求解器的回溯算法。感興趣的小伙伴可以學(xué)習(xí)一下2022-02-02
Python在Excel中添加數(shù)據(jù)條的代碼詳解
在Excel中添加數(shù)據(jù)條是一種數(shù)據(jù)可視化技巧,它通過(guò)條形圖的形式在單元格內(nèi)直觀展示數(shù)值的大小,尤其適合比較同一列或行中各個(gè)單元格的數(shù)值,本文將介紹如何使用Python在Excel中的指定單元格區(qū)域添加數(shù)據(jù)條,需要的朋友可以參考下2024-10-10
Python OOP類(lèi)中的幾種函數(shù)或方法總結(jié)
今天小編就為大家分享一篇關(guān)于Python OOP類(lèi)中的幾種函數(shù)或方法總結(jié),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02
Python中使用?zipfile創(chuàng)建文件壓縮工具
這篇文章主要介紹了Python中使用zipfile創(chuàng)建文件壓縮工具,通過(guò)使用 wxPython 模塊,我們創(chuàng)建了一個(gè)簡(jiǎn)單而實(shí)用的文件壓縮工具,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的ca參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09

