看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
我们知道,在数据清洗时经常会对缺失值进行填充,一般会填充进固定值,或者利用插补的办法进行填充。本案例我们看一个按顺序将一些数据依次填充在空值位。
源数据如下:
import pandas as pd
import numpy as np
# 构建数据
df = pd.DataFrame({'x': list('aabbccdd'),
'y': list('ABC')+5*[np.nan]})
# 创造缺失值
df.iloc[np.r_[2, 3, 5], 0] = np.nan
df
'''
x y
0 a A
1 a B
2 NaN C
3 NaN NaN
4 c NaN
5 NaN NaN
6 d NaN
7 d NaN
'''
以上数据中,x 列有三个缺失值,y 列只有 3 个有效值,但它们并不在行上对应,我们要做的是按照从上到下的顺序,将 y 列的 3 个有效值填充到 x 列的缺失位上。
如果填充的缺失值在行上是对应的,我们可以使用 df.fillna(axis=1, method='bfill')
来解决,但本需求是按顺序填充对应值,我们可能只能用修改数据的思路来解决。
我们可以先将 x 列的缺失值先筛选出来,并对它们赋值修改,确定修改对象时,将 y 列的有效值筛选出来。这里要注意的时,要对有效值消除标签(索引),因为修改值与缺失值索引并不对应,但缺失值的索引一定要保持不变,否则数据会错乱。
根据以上分析思路,设计代码如下:
# 筛选出 x 列的缺失值
df.x.loc[df.x.isna()]
'''
2 NaN
3 NaN
5 NaN
Name: x, dtype: object
'''
# 取 y 列的有效值
vlues = df.y.loc[df.y.notna()].to_list()
vlues
# ['A', 'B', 'C']
# 赋值修改值
df.x.loc[df.x.isna()] = vlues
df
'''
x y
0 a A
1 a B
2 A C
3 B NaN
4 c NaN
5 C NaN
6 d NaN
7 d NaN
'''
至此,完成了需求。
(完)
更新时间:2024-08-18 15:37:37 标签:pandas python 缺失值