pandas 缺失数据处理大全

作者 | 东哥起飞
来源 |?东哥起飞
GitHub获取:https://github.com/xiaoyusmd/PythonDataScience
一、缺失值类型
在pandas中,缺失数据显示为NaN。缺失值有3种表示方法,np.nan,none,pd.NA。
1、np.nan
nan和任何其它值比较都会返回nan。np.nan?==?np.nan
>>?False
np.nan。nan在Numpy中的类型是浮点,因此整型列会转为浮点;而字符型由于无法转化为浮点型,只能归并为object类型('O'),原来是浮点型的则类型不变。type(np.nan)
>>?float
pd.Series([1,2,3]).dtype
>>?dtype('int64')
pd.Series([1,np.nan,3]).dtype
>>?dtype('float64')
pandas的内置类型,可以视为时间序列版的np.nan,也是与自己不相等。s_time?=?pd.Series([pd.Timestamp('20220101')]*3)
s_time
>>?0?2022-01-01
???1?2022-01-01
???2?2022-01-01
???dtype:datetime64[ns]
-----------------
s_time[2]?=?pd.NaT
s_time
>>?0?2022-01-01
???1?2022-01-01
???2?NaT
???dtype:datetime64[ns]
2、None
None,它要比nan好那么一点,因为它至少自己与自己相等。None?==?None
>>?True
np.nan。type(pd.Series([1,None])[1])
>>?numpy.float64
object类型时是不变的,因此可以认为如果不是人工命名为None的话,它基本不会自动出现在pandas中,所以None大家基本也看不到。type(pd.Series([1,None],dtype='O')[1])
>>?NoneType
3、NA标量
s_new?=?pd.Series([1,?2],?dtype="Int64")
s_new
>>?0???1
???1???2
???dtype:?Int64
-----------------
s_new[1]?=?pd.NaT
s_new
>>?0????1
???1??<NA>
???dtype:?Int64
object类型的麻烦了。#####?算术运算
#?加法
pd.NA?+?1
>>?<NA>
-----------
#?乘法
"a"?*?pd.NA
>>?<NA>
-----------
#?以下两种其中结果为1
pd.NA?**?0
>>?1
-----------
1?**?pd.NA
>>?1
#####?比较运算
pd.NA?==?pd.NA
>>?<NA>
-----------
pd.NA?<?2.5
>>?<NA>
-----------
np.log(pd.NA)
>>?<NA>
-----------
np.add(pd.NA,?1)
>>?<NA>
二、缺失值判断
了解了缺失值的几种形式后,我们要知道如何判断缺失值。对于一个dataframe而言,判断缺失的主要方法就是isnull()或者isna(),这两个方法会直接返回True和False的布尔值。可以是对整个dataframe或者某个列。
df?=?pd.DataFrame({
??????'A':['a1','a1','a2','a3'],
??????'B':['b1',None,'b2','b3'],
??????'C':[1,2,3,4],
??????'D':[5,None,9,10]})
#?将无穷设置为缺失值??????
pd.options.mode.use_inf_as_na?=?True
1、对整个dataframe判断缺失
df.isnull()
>>?A?B?C?D
0?False?False?False?False
1?False?True?False?True
2?False?False?False?False
3?False?False?False?False
2、对某个列判断缺失
df['C'].isnull()
>>?0????False
???1????False
???2????False
???3????False
Name:?C,?dtype:?bool
notna(),使用方法是一样的,结果相反。三、缺失值统计
1、列缺失
dataframe的列进行缺失统计,查看每个列有多少缺失,如果缺失率过高再进行删除或者插值等操作。那么直接在上面的isnull()返回的结果上直接应用.sum()即可,axis默认等于0,0是列,1是行。##?列缺失统计
isnull().sum(axis=0)
2、行缺失
sum()中设置axis=1即可。##?行缺失统计
isnull().sum(axis=1)
3、缺失率
##?缺失率
df.isnull().sum(axis=0)/df.shape[0]
##?缺失率(一步到位)
isnull().mean()
四、缺失值筛选
#?筛选有缺失值的行
df.loc[df.isnull().any(1)]
>>?A?B?C?D
1?a1?None?2?NaN
-----------------
#?筛选有缺失值的列
df.loc[:,df.isnull().any()]
>>?B?D
0?b1?5.0
1?None?NaN
2?b2?9.0
3?b3?10.0
~操作:df.loc[~(df.isnull().any(1))]
>>?A?B?C?D
0?a1?b1?1?5.0
2?a2?b2?3?9.0
3?a3?b3?4?10.0
any判断只要有缺失就进行筛选,也可以用all判断是否全部缺失,同样可以对行里进行判断,如果整列或者整行都是缺失值,那么这个变量或者样本就失去了分析的意义,可以考虑删除。五、缺失值填充
fillna。#?将dataframe所有缺失值填充为0
df.fillna(0)
>>?A?B?C?D
0?a1?b1?1?5.0
1?a1?0?2?0.0
2?a2?b2?3?9.0
3?a3?b3?4?10.0
--------------
#?将D列缺失值填充为-999
df.D.fillna('-999')
>>?0???????5
???1????-999
???2???????9
???3??????10
Name:?D,?dtype:?object
inplace:可以设置 fillna(0, inplace=True)来让填充生效,原dataFrame被填充。methond:可以设置 methond方法来实现向前或者向后填充,pad/ffill为向前填充,bfill/backfill为向后填充,比如df.fillna(methond='ffill'),也可以简写为df.ffill()。
df.ffill()
>>?A?B?C?D
0?a1?b1?1?5.0
1?a1?b1?2?5.0
2?a2?b2?3?9.0
3?a3?b3?4?10.0
df.D.fillna(df.D.mean())
>>?0?????5.0
???1?????8.0
???2?????9.0
???3????10.0
Name:?D,?dtype:?float64
六、缺失值删除
删除缺失值也非情况,比如是全删除还是删除比较高缺失率,这个要看自己的容忍程度,真实的数据必然会存在缺失的,这个无法避免。而且缺失在某些情况下也代表了一定的含义,要视情况而定。
1、全部直接删除
#?全部直接删除
df.dropna()
>>?A?B?C?D
0?a1?b1?1?5.0
2?a2?b2?3?9.0
3?a3?b3?4?10.0
2、行缺失删除
#?行缺失删除
df.dropna(axis=0)
>>?A?B?C?D
0?a1?b1?1?5.0
2?a2?b2?3?9.0
3?a3?b3?4?10.0
3、列缺失删除
#?列缺失删除
df.dropna(axis=1)
>>?A?C
0?a1?1
1?a1?2
2?a2?3
3?a3?4
-------------
#?删除指定列范围内的缺失,因为C列无缺失,所以最后没有变化
df.dropna(subset=['C'])
>>?A?B?C?D
0?a1?b1?1?5.0
1?a1?None?2?NaN
2?a2?b2?3?9.0
3?a3?b3?4?10.0
4、按缺失率删除
df.loc[:,df.isnull().mean(axis=0)?<?0.1]
>>?A?C
0?a1?1
1?a1?2
2?a2?3
3?a3?4
-------------
#?删除行缺失大于0.1的
df.loc[df.isnull().mean(axis=1)?<?0.1]
>>?A?B?C?D
0?a1?b1?1?5.0
2?a2?b2?3?9.0
3?a3?b3?4?10.0
七、缺失值参与计算
如果不对缺失值处理,那么缺失值会按照什么逻辑进行计算呢?
下面我们一起看一下各种运算下缺失值的参与逻辑。
df
>>A?B?C?D
0?a1?b1?1?5.0
1?a1?None?2?NaN
2?a2?b2?3?9.0
3?a3?b3?4?10.0
---------------
#?对所有列求和
df.sum()
>>?A????a1a1a2a3
???C??????????10
???D??????????24
#?对D列进行累加
df.D.cumsum()
>>?0?????5.0
???1?????NaN
???2????14.0
???3????24.0
Name:?D,?dtype:?float64
---------------
df.D.cumsum(skipna=False)
>>?0????5.0
???1????NaN
???2????NaN
???3????NaN
Name:?D,?dtype:?float64
cumsum累加会忽略NA,但值会保留在列中,可以使用skipna=False跳过有缺失值的计算并返回缺失值。#?对列计数
df.count()
>>?A????4
???B????3
???C????4
???D????3
dtype:?int64
df.groupby('B').sum()
>>?C?D
B??
b1?1?5.0
b2?3?9.0
b3?4?10.0
---------------
df.groupby('B',dropna=False).sum()
>>?C?D
B??
b1?1?5.0
b2?3?9.0
b3?4?10.0
NaN?2?0.0
dropna=False。这个用法和其它比如value_counts是一样的,有的时候需要看缺失值的数量。
分享
点收藏
点点赞
点在看
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
关注网络尖刀微信公众号随时掌握互联网精彩
赞助链接
排名
热点
搜索指数
- 1 习近平将发表二〇二六年新年贺词 7904141
- 2 2026年国补政策来了 7808738
- 3 东部战区:开火!开火!全部命中! 7712893
- 4 2026年这些民生政策将惠及百姓 7616985
- 5 小学食堂米线过期2.5小时被罚5万 7519709
- 6 解放军喊话驱离台军 原声曝光 7428214
- 7 为博流量直播踩烈士陵墓?绝不姑息 7327605
- 8 每月最高800元!多地发放养老消费券 7238391
- 9 数字人民币升级 1月1日起将计付利息 7141831
- 10 2026年1月1日起 一批新规将施行 7040675












AI100
