Python之np.where()如何替换缺失值

 更新时间:2024年02月02日 15:45:32   作者:Asher117  
这篇文章主要介绍了Python中的np.where()如何替换缺失值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

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:类似数组的对象,给出值的地方,如果 conditionTrue,从 x 中选取值,conditionFalse,从 y 中选取值。

有返回值,返回一个满足条件时取x中对应的值,不满足条件时取 y 中对应值的数组。

注意:

这里的 conditionxy只是为了表示以及说明时的必要,并不是真正意义上的关键字。

示例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_ 的结果为 44 表示一维数组中最大元素所对应的索引值。

示例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,当我们的 conditonFalse 时从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] 获取数组中满足要求的元素时,获取到的满足要求的元素会被自动展平存放在一个一维数组中。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • python中tab键是什么意思

    python中tab键是什么意思

    在本篇内容里小编给大家整理了关于python中的tab键表示什么意思的相关内容,需要的朋友们可以参考学习下。
    2020-06-06
  • python常见运算符及用法小结

    python常见运算符及用法小结

    python中的运算符主要包括算术运算符,关系(比较)运算符,赋值运算符,逻辑运算符,成员运算符,身份运算符,三目运算符。使用运算符将不同类型的数据按照一定的规则连接起来的式子,称为表达式。下面将介绍一些常用的运算符
    2022-08-08
  • Python增量循环删除MySQL表数据的方法

    Python增量循环删除MySQL表数据的方法

    这篇文章主要介绍了Python增量循环删除MySQL表数据的相关资料,本文介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • python Tornado框架详解

    python Tornado框架详解

    Tornado是一个 Python Web框架,用于开发高性能网络应用程序,本文给大家详细介绍python Tornado框架的相关知识,感兴趣的朋友一起看看吧
    2024-03-03
  • python实现移动木板小游戏

    python实现移动木板小游戏

    这篇文章主要为大家详细介绍了python实现移动木板小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • python_tkinter事件类型详情

    python_tkinter事件类型详情

    这篇文章主要介绍了python_tkinter事件详情,文章基于python_tkinter事件相关资料分享的内容有事件绑定函数,事件对象等相关自资料,需要的小伙伴可以参考一下
    2022-03-03
  • 浅谈Python的正则表达式

    浅谈Python的正则表达式

    这篇文章主要介绍了浅谈Python的正则表达式,正则表达式本身是独立于编程语言的知识,但是它又依附于编程语言,需要的朋友可以参考下
    2023-04-04
  • Python的面向对象思想分析

    Python的面向对象思想分析

    这篇文章主要介绍了Python的面向对象思想分析,以实例形式较为详细的分析了封装,继承,多态的具体用法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • Python采集代理ip并判断是否可用和定时更新的方法

    Python采集代理ip并判断是否可用和定时更新的方法

    今天小编就为大家分享一篇Python采集代理ip并判断是否可用和定时更新的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 详细一文带你分清Python中的模块、包和库

    详细一文带你分清Python中的模块、包和库

    这篇文章主要介绍了详细一文带你分清Python中的模块、包和库,Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句,模块能定义函数,类和变量,模块也能包含可执行的代码,需要的朋友可以参考下
    2023-08-08

最新评论