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 分秒必争全力抢险救援 7902356
- 2 年度反腐大片第四集 7940873
- 3 青海发生5.5级地震 7895920
- 4 预防甲流 关键做好这几点 7719140
- 5 美加州山火肆虐 好莱坞明星豪宅被烧 7697786
- 6 小猫突然出现按下辞职报告发送键 7568511
- 7 从教科书上发现自己生病了 7437910
- 8 特朗普放狠话要抢地盘 多国回应 7352591
- 9 我给讨厌的人祈福就何惟芳这样 7228559
- 10 CBA一球员把女友装行李箱带进宿舍 7155229