看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
由于数据的来源的复杂性、不确定性,数据中难免会存在字段值不全、缺失等情况,本文将介绍如何找出这些缺失的值。
一般使用特殊类型 NaN
代表缺失值,可以用 Numpy 可定义它np.NaN/np.nan
。在 Pandas 1.0 以后实验性地使用一个标量 pd.NA
来代表。
如果想把正负无穷也为认是缺失值,可以通过以下全局配置来设定:
pandas.options.mode.use_inf_as_na = True
以下数据 NaN 为缺失值:
(pd.DataFrame(np.random.randn(5, 3),
index=['a', 'c', 'e', 'f', 'h'],
columns=['one', 'two', 'three'])
.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
)
'''
one two three
a 1.632088 -0.062136 -1.389717
b NaN NaN NaN
c 0.151073 1.145583 -1.893389
d NaN NaN NaN
e -0.313452 -0.029717 -0.104649
f -0.128399 1.478465 -1.215389
g NaN NaN NaN
h -1.504212 -0.409655 -1.263877
'''
可以判断是否缺失值,DataFrame 和 Series 一般都支持。:
# 不是缺失值
df.one.notna()
'''
a True
b False
c True
d False
e True
f True
g False
h True
Name: one, dtype: bool
'''
# 是缺失值
df.isna()
# 进行筛选
df[df.one.notna()]
需要注意的是,Numpy 中 np.nan 和 np.nan 不相等,因此不能用 ==/!=
进行对比:
None == None # noqa: E711
# True
np.nan == np.nan
# False
None == np.nan
# False
因此,请使用:
df.notna()
df['team'].isna()
df['team'].isnull()
# 每列有多少个缺失值
df.isnull().sum()
# 每行有多少个缺失值
df.isnull().sum(axis=1)
# 总共共有多少个缺失值
df.isna().sum().sum()
# 有缺失值的行
df.loc[df.isna().any(axis=1)]
# 有缺失值的列
df.loc[:,df.isna().any()]
# 没有缺失值的行
df.loc[~(df.isna().any(axis=1))]
# 没有缺失值的列
df.loc[:,~(df.isna().any())]
# 返回第一个非NA/空值的索引
df.first_valid_index() # 0
# 返回最后一个非NA/空值的索引
df.last_valid_index() # 99
由于 NaN 是浮点型,因此一列甚至缺少一个整数的整数列都将转换为浮点。
pd.Series([1, 2, np.nan, 4], dtype=pd.Int64Dtype())
'''
0 1
1 2
2 <NA>
3 4
dtype: Int64
'''
对于时间中的缺失值,Pandas 提供了一个 NaT
来表示,并且 NaT 和 NaN 之间是兼容的:
df['timestamp'] = pd.Timestamp('20120101')
df.loc[['a', 'c', 'h'], ['one', 'timestamp']] = np.nan
df.timestamp
'''
a NaT
b 2012-01-01
c NaT
d 2012-01-01
e 2012-01-01
f 2012-01-01
g 2012-01-01
h NaT
Name: timestamp, dtype: datetime64[ns]
'''
可以使用 None
等方法将内容修改为缺失值:
s.loc[0] = None
s.loc[1] = np.nan
df.two = pd.NA
更新时间:2024-08-09 09:38:40 标签:pandas 缺失值