Python之np.where()如何替换缺失值
作者:Asher117
np.where()替换缺失值
使用Python做数据分析时经常需要替换缺失值。
np.where(条件,x,y)
np.where函数的结果是,如果“条件”为真,则x,否则y。
如下:
import pandas as pd import numpy as np df = pd.DataFrame(data={ 'A':[1,1,np.nan,2], 'B':[2,np.nan,4,5], 'C':[3,8,12,6] }) df A B C 0 1.0 2.0 3 1 1.0 NaN 8 2 NaN 4.0 12 3 2.0 5.0 6
使用np.where在A列缺失值处填C列的数
df['A'] = np.where(df['A'].isnull(),df['C'],df['A']) df A B C 0 1.0 2.0 3 1 1.0 NaN 8 2 12.0 4.012 3 2.0 5.0 6 ####################
使用data(DataFrame)的A列,填补df的A列
eg:
df['A'] = np.where(df['A'].isnull(),data['A'],df['A'])
np.where()函数
调用方式及参数说明
numpy.where(condition[, x, y])
各个参数意义:
condition
:类似数组的对象,布尔值x, y
:类似数组的对象,给出值的地方,如果condition
为True
,从x
中选取值,condition
为False
,从y
中选取值。
有返回值,返回一个满足条件时取x
中对应的值,不满足条件时取 y
中对应值的数组。
注意:
这里的 condition
,x
,y
只是为了表示以及说明时的必要,并不是真正意义上的关键字。
示例1:获取一维数组中最大元素所处位置
这里我们给出使用 np.where()
函数获取一维数组中最大值对应位置的例子。
# -*- coding:utf-8 -*- """ author: 15025 time: 2020/12/30 20:27 software: PyCharm """ import numpy as np class Debug: @staticmethod def mainProgram(): array = np.array([0, 1, 2, 3, 5, 4]) array_ = np.where(array == np.max(array)) print("array_的值为:") print(array_) if __name__ == "__main__": main = Debug() main.mainProgram() """ array_的值为: (array([4], dtype=int64),) """
这里 array_
的结果为 4
,4
表示一维数组中最大元素所对应的索引值。
示例2:获取二维数组中最大元素所处位置
# -*- coding:utf-8 -*- """ author: 15025 time: 2020/12/30 20:27 software: PyCharm """ import numpy as np class Debug: @staticmethod def mainProgram(): array = np.array([[0, 1, 2, 3, 5, 4, 5], [0, 1, 2, 3, 4, 5, 5]]) array_ = np.where(array == np.max(array)) print("array_的值为:") print(array_) if __name__ == "__main__": main = Debug() main.mainProgram() """ array_的值为: (array([0, 0, 1, 1], dtype=int64), array([4, 6, 5, 6], dtype=int64)) """
首先通过观察不难发现,该二维数组中的最大值为 5
,且一共有 4
个最大元素存在,因此,最终的结果应该存在 4
组数据表示这四个元素的位置。
结果中的 array([0, 0, 1, 1], dtype=int64)
表示数组中的 y
索引值,array([4, 6, 5, 6], dtype=int64)
表示 x
的索引值。
示例3:获取三维数组中最大元素所处位置
# -*- coding:utf-8 -*- """ author: 15025 time: 2020/12/30 20:27 software: PyCharm """ import numpy as np class Debug: @staticmethod def mainProgram(): array = np.array([[[0, 1], [0, 1]], [[1, 2], [1, 2]], [[1, 3], [1, 3]]]) array_ = np.where(array == np.max(array)) print("array_的值为:") print(array_) if __name__ == "__main__": main = Debug() main.mainProgram() """ array_的值为: (array([2, 2], dtype=int64), array([0, 1], dtype=int64), array([1, 1], dtype=int64)) """
显而易见,三维结果同二维的情况类似,只是多了一个维度,且输出结果三组数据分别对应 z,y,x
坐标,其他的这里不做过多解释了。
示例4:Condition 方法
# -*- coding:utf-8 -*- """ author: 15025 time: 2020/12/30 20:27 software: PyCharm """ import numpy as np class Debug: @staticmethod def mainProgram(): array = np.where([[True, False], [True, True]], [[1, 2], [3, 4]], [[9, 8], [7, 6]]) print("array的值为:") print(array) if __name__ == "__main__": main = Debug() main.mainProgram() """ array的值为: [[1 8] [3 4]] """
我们可以看到,这里的 [[True, False], [True, True]]
相当于我们说的 condition
,[[1, 2], [3, 4]]
相当于 x
,[[9, 8], [7, 6]]
相当于 y
,当我们的 conditon
为 False
时从y
中取出了数值 8
,其他数值全部从 x
中的对应位置取出。最终我们得到了上述结果。
示例5:更改二维数组中符合要求的数据
这里我们将二维数组中值大于等于 3
的元素更改为 8
。
显然,值大于等于 3
的元素对应倒数第二个元素和最后一个元素。
import numpy as np arr_2d = np.array([[1, 2], [3, 4]]) pos_y, pos_x = np.where(arr_2d >= 3) print(f"np.where() 函数得到的索引值元胞的形状为: {arr_2d[np.where(arr_2d >= 3)].shape}") print(f"np.where() 函数得到的索引值元胞的形状为: {arr_2d[pos_y, pos_x].shape}") print(f"二维数组 arr_2d 中满足要求的元素为: {arr_2d[pos_y, pos_x]}") arr_2d[pos_y, pos_x] = 8 print("修改元素后二维数组中存放的元素值为:") print(arr_2d) """ result: np.where() 函数得到的索引值元胞的形状为: (2,) np.where() 函数得到的索引值元胞的形状为: (2,) 二维数组 arr_2d 中满足要求的元素为: [3 4] 修改元素后二维数组中存放的元素值为: [[1 2] [8 8]] """
这里需要注意的一点是,当我们使用 np.where()
函数获取对应二维数组中满足要求的元素值的索引后,再通过 arr_2d[pos_y, pos_x]
获取数组中满足要求的元素时,获取到的满足要求的元素会被自动展平存放在一个一维数组中。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。