本篇详解pandas中缺失值(Missing data handling)解决罕用操作。

缺失值解决罕用于数据分析数据荡涤阶段;

Pandas中将如下类型定义为缺失值:

NaN: ‘’, ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’,‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘<NA>’, ‘N/A’, ‘NA’,‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’,None

1、pandas中缺失值注意事项

pandas和numpy中任意两个缺失值不相等(np.nan != np.nan)

下图中两个NaN不相等:

In [224]: df1.iloc[3:,0].values#取出'one'列中的NaNOut[224]: array([nan])In [225]: df1.iloc[2:3,1].values#取出'two'列中的NaNOut[225]: array([nan])In [226]: df1.iloc[3:,0].values == df1.iloc[2:3,1].values#两个NaN值不相等Out[226]: array([False])

pandas读取文件时那些值被视为缺失值

NaN: ‘’, ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’,‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘<NA>’, ‘N/A’, ‘NA’,‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’,None

2、pandas缺失值操作

pandas.DataFrame中判断那些值是缺失值:isna办法

#定义一个试验DataFrameIn [47]: d = {'one': pd.Series([1., 2., 3.], index=['a', 'b', 'c']),'two': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}In [48]: df = pd.DataFrame(d)In [49]: dfOut[49]:   one  twoa  1.0  1.0b  2.0  2.0c  3.0  3.0d  NaN  4.0In [120]: df.isna()#返回形态一样的bool值填充DataFrameOut[120]:     one    twoa  False  Falseb  False  Falsec  False  Falsed   True  False

pandas.DataFrame中删除蕴含缺失值的行:dropna(axis=0)

In [67]: dfOut[67]:   one  twoa  1.0  1.0b  2.0  2.0c  3.0  3.0d  NaN  4.0In [68]: df.dropna()#默认axis=0Out[68]:   one  twoa  1.0  1.0b  2.0  2.0c  3.0  3.0

pandas.DataFrame中删除蕴含缺失值的列:dropna(axis=1)

In [72]: df.dropna(axis=1)Out[72]:   twoa  1.0b  2.0c  3.0d  4.0

pandas.DataFrame中删除蕴含缺失值的列和行:dropna(how='any')

In [97]: df['three']=np.nan#新增一列全为NaNIn [98]: dfOut[98]:   one  two  threea  1.0  1.0    NaNb  2.0  2.0    NaNc  3.0  3.0    NaNd  NaN  4.0    NaNIn [99]: df.dropna(how='any')Out[99]:Empty DataFrame#全删除了Columns: [one, two, three]Index: []

pandas.DataFrame中删除全是缺失值的行:dropna(axis=0,how='all')

In [101]: df.dropna(axis=0,how='all')Out[101]:   one  two  threea  1.0  1.0    NaNb  2.0  2.0    NaNc  3.0  3.0    NaNd  NaN  4.0    NaN

pandas.DataFrame中删除全是缺失值的列:dropna(axis=1,how='all')

In [102]: df.dropna(axis=1,how='all')Out[102]:   one  twoa  1.0  1.0b  2.0  2.0c  3.0  3.0d  NaN  4.0

pandas.DataFrame中应用某个值填充缺失值:fillna(某个值)

In [103]: df.fillna(666)#应用666填充Out[103]:     one  two  threea    1.0  1.0  666.0b    2.0  2.0  666.0c    3.0  3.0  666.0d  666.0  4.0  666.0

pandas.DataFrame中应用前一列的值填充缺失值:fillna(axis=1,method='ffill')

#后一列填充为fillna(axis=1,method=bfill')In [109]: df.fillna(axis=1,method='ffill')Out[109]:   one  two  threea  1.0  1.0    1.0b  2.0  2.0    2.0c  3.0  3.0    3.0d  NaN  4.0    4.0

pandas.DataFrame中应用前一行的值填充缺失值:fillna(axis=0,method='ffill')

#后一行填充为fillna(axis=1,method=bfill')In [110]: df.fillna(method='ffill')Out[110]:   one  two  threea  1.0  1.0    NaNb  2.0  2.0    NaNc  3.0  3.0    NaNd  3.0  4.0    NaN

pandas.DataFrame中应用字典传值填充指定列的缺失值

In [112]: df.fillna({'one':666})#填充one列的NaN值Out[112]:     one  two  threea    1.0  1.0    NaNb    2.0  2.0    NaNc    3.0  3.0    NaNd  666.0  4.0    NaNIn [113]: df.fillna({'three':666})Out[113]:   one  two  threea  1.0  1.0  666.0b  2.0  2.0  666.0c  3.0  3.0  666.0d  NaN  4.0  666.0

以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料。或是返回编程学习网,理解更多编程技术常识。