稀土掘金 稀土掘金

如何在pandas数据框架中填充NaNs(附实例)

缺失值是很常见的,发生的原因可能是人为错误、仪器错误、来自另一个团队的处理,或者其他方面只是缺少某个观察点的数据。

在这个字节中,我们将看看如何在DataFrame ,如果你选择通过填充NaN来处理的话。

首先,让我们创建一个模拟的DataFrame ,并丢掉一些随机值:

import numpy as np
array = np.random.randn(25, 3)
mask = np.random.choice([1, 0], array.shape, p=[.3, .7]).astype(bool)
array[mask] = np.nan

df = pd.DataFrame(array, columns=['Col1', 'Col2', 'Col3'])
        Col1      Col2      Col3 
0  -0.671603 -0.792415  0.783922
1   0.207720       NaN  0.996131
2  -0.892115 -1.282333       NaN
3  -0.315598 -2.371529 -1.959646
4        NaN       NaN -0.584636
5   0.314736 -0.692732 -0.303951
6   0.355121       NaN       NaN
7        NaN -1.900148  1.230828
8  -1.795468  0.490953       NaN
9  -0.678491 -0.087815       NaN
10  0.755714  0.550589 -0.702019
11  0.951908 -0.529933  0.344544
12       NaN  0.075340 -0.187669
13       NaN  0.314342 -0.936066
14       NaN  1.293355  0.098964

让我们绘制一下,比如说,第三列:

plt.plot(df['Col3'])

当用各种技术填充时--这个充满NaN的图形可以被替换成。

fillna() - 平均数、中位数、模式

你可以把这些值填充到一个新的列中,然后把它分配给你想填充的列,或者使用inplace 参数在原地填充。在这里,我们将在一个新的列中提取填充的值,以方便检查:

mean = df['Col3'].fillna(df['Col3'].mean(), inplace=False)
median = df['Col3'].fillna(df['Col3'].median(), inplace=False)
mode = df['Col3'].fillna(df['Col3'].mode(), inplace=False)

这一列的中位数、平均值和模式是-0.187669,-0.1108730.000000 ,这些值将分别用于每个NaN。这实际上是用常量值进行填充,输入的值取决于该列的属性。

首先,用中值填充的结果是:

使用平均值:

有了模式值:

fillna() - 常量值

你也可以用一个常量值来代替填充:

constant = df['Col3'].fillna(0, inplace=False

这导致一个常量值(0)被放入,而不是每个NaN。0 ,接近我们的中位数和平均值,并等于模式,所以对于我们的模拟数据集,填充的值将与该方法非常相似:

0     0.783922
1     0.996131
2     0.000000
3    -1.959646
4    -0.584636
5    -0.303951
6     0.000000
7     1.230828
8     0.000000
9     0.000000
10   -0.702019
11    0.344544
12   -0.187669
13   -0.936066
14    0.098964

fillna() - 前向和后向填充

在每一行--你可以做一个向前或向后的填充,从之前或之后的行中取值。

ffill = df['Col3'].fillna(method='ffill')
bfill = df['Col3'].fillna(method='bfill')

在前向填充中,由于我们在第2行缺失,所以从第1行取值来填充第二行。这些值会向前传播:

0     0.783922
1     0.996131
2     0.996131
3    -1.959646
4    -0.584636
5    -0.303951
6    -0.303951
7     1.230828
8     1.230828
9     1.230828
10   -0.702019
11    0.344544
12   -0.187669
13   -0.936066
14    0.098964

在后向填充的情况下,情况正好相反。第2行用第3行的值来填充:

0     0.783922
1     0.996131
2    -1.959646
3    -1.959646
4    -0.584636
5    -0.303951
6     1.230828
7     1.230828
8    -0.702019
9    -0.702019
10   -0.702019
11    0.344544
12   -0.187669
13   -0.936066
14    0.098964

不过,如果在一个序列中有多个NaN ,这些就不会做得很好,而且会进一步串联NaN,使数据发生偏移,并删除实际记录的值。

插值()

interpolate() 方法将数值的插值委托给SciPy 用于插值的一套方法。它接受各种各样的参数,包括:nearest,zero,slinear,quadratic,cubic,spline,barycentric,polynomial,krogh,piecewise_polynomial,spline,pchip,akima,cubicspline 等。

内插法比以前的方法只是用常数或半变量填充数值要灵活和 "聪明 "得多。

插值可以正确地填充一个序列,这是其他方法所不能做到的,比如说:

s = pd.Series([0, 1, np.nan, np.nan, np.nan, 5])
s.fillna(s.mean()).values
# array([0., 1., 2., 2., 2., 5.])
s.fillna(method='ffill').values
# array([0., 1., 1., 1., 1., 5.])
s.interpolate().values
# array([0., 1., 2., 3., 4., 5.])

默认的插值是线性的,假设1...5 ,很可能是一个1, 2, 3, 4, 5 的序列并不牵强(但不保证)。常数填充和前向或后向填充在这里都惨遭失败。一般来说--当涉及到填补嘈杂信号中的NaN或损坏的数据集时,插值通常会是一个好朋友。

实验一下插值的类型可能会产生更好的结果。

这里有两种插值方法(splicepolynomial 需要一个order 参数):

nearest = df['Col3'].interpolate(method='nearest')
polynomial = df['Col3'].interpolate(method='polynomial', order=3)

这些结果是:

和:

玻璃钢生产厂家济宁销售玻璃钢造型雕塑黑龙江玻璃钢雕塑售价山西附近玻璃钢卡通雕塑厂家句容商场大厅美陈清远美陈玻璃钢雕塑浙江城市标志玻璃钢雕塑玻璃钢花盆挂件玻璃钢雕塑摆件礼物巴彦淖尔玻璃钢广场雕塑松原景区玻璃钢雕塑厂家甘肃玻璃钢商场美陈定制玻璃钢雕塑批发北京玻璃钢动物雕塑厂家深圳玻璃钢果蔬雕塑辽宁省玻璃钢雕塑加工重庆玻璃钢天使雕塑玻璃钢浮雕抽象雕塑定做厂家无锡港粤玻璃钢座椅雕塑江苏景观玻璃钢雕塑公司北滘玻璃钢人物雕塑在线下单西安玻璃钢寺庙雕塑浙江水果玻璃钢雕塑设计金山区拉丝玻璃钢雕塑中山玻璃钢动物雕塑销售价格河源玻璃钢雕塑人像定做厂家广东儿童门头玻璃钢雕塑亳州园林玻璃钢雕塑定做奥体商场入口美陈商场美陈布搭配地铁娄底玻璃钢人物雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化