20【numpy中的nan和常用方法】02numpy中填充nan_numpy nan_yuhui_2000的博客-程序员秘密

技术标签: python  数据分析  数据分析2  

ndarray中nan的替换(均值)

ndarray中存在nan,如何操作才能够将nan替换为每一列的均值?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# 判断这一列中是否有nan数据
for i in range(arr.shape[1]):  # 对列进行遍历
    current_col=arr[:,i]  # 当前的这一列
    # 判断当前的这一列中是否有nan数据  如果有  有几个
    nan_num=np.count_nonzero(current_col!=current_col)  # 这一列中nan数据的个数
    
    if nan_num!=0:  # 说明这一列数据中有nan数据
        not_nan_array=current_col[current_col==current_col]  # 取出这一列中不为nan的数据  返回的是一个数组
        # 求出这一列中不为nan的数据构成的数组的均值  arr.mean()
        # 用这一列的均值来替换这一列的nan数据
        # 取出这一列的nan数据
        # current_col[current_col!=current_col]
        # current_col[np.isnan(current_col)]
        # np.isnan(arr)  将数组中的nan数据标记为True  否则标记为False
        current_col[np.isnan(current_col)]=not_nan_array.mean()  # 赋值

在这里插入图片描述
由于 使用这一列的均值来填充这一列的缺失值数据 是一种很常用的方法,所以我们可以将这个方法定义为一个函数,以后需要使用的时候直接调用这个函数就可以了

在这里插入图片描述
简单看一下效果怎么样

先创造一个含有缺失值的数组对象

在这里插入图片描述
然后再调用这个函数

在这里插入图片描述
结果是正确的,我们可以看见,最后返回的数组对象中,它的缺失值部分的确是用这一列的均值来代替了。

这是完整的代码

# -*- coding: utf-8 -*-

'''
@Time    : 2020/12/05 19:49
@Author  : yuhui
@Email   : [email protected]
@FileName: numpy_2.py
@Software: PyCharm
'''

"""19【numpy中的nan和常用方法】01numpy中的nan和常用统计方法"""

import numpy as np

def fill_array_nan(arr):
    """
    :param arr: 含有nan缺失值的数组对象
    :return: 用这一列的平均值来替换这一列的缺失值
    """
    # 对这个数组进行列遍历
    for i in range(arr.shape[1]):
        current_col=arr[:,i]  # 取出当前正在被遍历的一列
        # 检查当前的这一列中是否存在nan缺失值  如果有  有几个
        nan_array = current_col[current_col != current_col]  # 这一列中缺失值的数组
        if nan_array is not None:  # 数组不为空  说明存在缺失值
            not_nan_array = current_col[current_col == current_col]  # 这一列中不为nan的数据
            # 用正常值的均值来替换这一列的缺失值数据
            # current_col[current_col!=current_col]=not_nan_array.mean()
            # 下面这种也可以  相当于是current_col[current_col!=current_col]
            current_col[np.isnan(current_col)] = not_nan_array.mean()

    return arr  # 返回替换之后的数组对象

if __name__ == '__main__':
    arr = np.arange(20).reshape(4, 5).astype("float32")
    arr[2:,:] = np.nan
    print(arr)
    print("*"*50)
    print(fill_array_nan(arr))

小的知识点

1.如何对数组进行行遍历

在这里插入图片描述

2.如何对数组进行列遍历

在这里插入图片描述

3.检查数组中是否存在缺失值数据 如果有 有几个

1.判断缺失值的数量是否为0

缺失值的数量:

  • np.count_nonzero(np.isnan(arr))
  • np.count_nonzero(arr!=arr)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2.判断缺失值的数组对象是否为空

缺失值的数组对象

  • arr[np.isnan(arr)]
  • arr[arr!=arr]

在这里插入图片描述
在这里插入图片描述
这个时候,我们又得到了两种取数组中缺失值数量的方法:

  • len(arr[np.isnan(arr)])
  • len(arr[arr!=arr])

在这里插入图片描述

小结

  • 如何选择一行或者多行的数据(列)?
  • 如何给选取的行或者列赋值?
  • 如何大于把大于10的值替换为10?
  • np.where如何使用?
  • np.clip如何使用?
  • 如何转置(交换轴)?
  • 读取和保存数据为csv?
  • np.nan和np.inf是什么?
  • 常用的统计函数你记得几个?
  • 标准差反映出数据的什么信息?

动手

现在这里有一个英国和美国各自youtube1000多个视频的【点击】【喜欢】【不喜欢】【评论数量】([“views”,“likes”,“dislikes”,“comment_total”])的Excel文件,运用所学习的知识,完成下面的两个练习。

数据来源:https://www.kaggle.com/datasnaek/youtube/data

例题1

利用已经学习过的知识和英国、美国各自youtube1000的数据绘制出各自的评论数量的直方图。

原始数据

美国youtube1000的数据

在这里插入图片描述

代码+分析+结果

# -*- coding: utf-8 -*-

'''
@Time    : 2020/12/08 16:24
@Author  : yuhui
@Email   : [email protected]
@FileName: numpy_3.py
@Software: PyCharm
'''

"""20【numpy中的nan和常用方法】numpy中填充nan"""

import numpy as np
import matplotlib.pyplot as plt

# 解决中文乱码
plt.rcParams["font.sans-serif"]=["KaiTi"]
plt.rcParams["font.family"]="sans-serif"
# 解决符号无法显示的问题
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像时负号'-'显示为方块的问题

"""设置图形大小和图片品质"""
fig=plt.figure(
    figsize=(16,9),
    dpi=100,
)

us_file_path=r"D:\Python\数据分析\数据分析2\data\us.csv"

us=np.loadtxt(us_file_path,  # 文件路径
              dtype="int32",  # 数据类型
              delimiter=",",  # 分隔符
              skiprows=1  # 跳过开头的几行
              )

us_comments=us  # us的评论数量  所有的行  第0列

"""绘制直方图"""

# 打印出最大值和最小值  根据最大值和最小值确定出组距,进而确定组数
# print(us_comments.max(),us_comments.min())  # 4996 117

# 组距
group_spacing=250

# 组数
num_bins=(us_comments.max()-us_comments.min())//group_spacing

# 绘制直方图

plt.hist(us_comments,num_bins,
         color="#6495ED",  # 颜色
         )

"""设置x轴刻度"""
plt.xticks(range(min(us_comments),max(us_comments)+group_spacing,group_spacing))

"""绘制网格线"""
plt.grid(
    linestyle=":",  # 线型
    color="#6495ED",  # 颜色  CornflowerBlue	矢车菊的蓝色	#6495ED	100,149,237
    alpha=0.4,  # 透明度
)

plt.show()

在这里插入图片描述
在这里插入图片描述

显然,这次的结果是不够好的,有许多地方都需要改进一下。

在这里插入图片描述
那么,我们应该如何处理我们的组距和组数呢?

要想直方图的外部轮廓线和背景网格线对齐,最好是
在这里插入图片描述
修改一下组距

# 打印出最大值和最小值  根据最大值和最小值确定出组距,进而确定组数
# print(us_comments.max(),us_comments.min())  # 4996 117

# 组距
group_spacing=17*41
# 4996-117=4879=7*17*41
# 组数
num_bins=(us_comments.max()-us_comments.min())//group_spacing  # =7*17*41/(17*41)=7  # 整数

在这里插入图片描述
结果如下

在这里插入图片描述
在这里插入图片描述

在以后我们使用Python进行绘图时,图形的美观只是一方面,我们最根本的目的其实还是希望能够从图形中获得数据的规律,总结这些规律并且能够让我们使用。所以判断一个图形的优劣的第一标准应该是这个图形是否能够展现数据的规律,这才是最重要的,其余的都是其次重要的。不过如果说你能够在满足第一要求的情况下,还能够将这个图形做得尽可能的美观,那你的这次绘图工作可以说就是相当的成功了。

这是全部的代码

# -*- coding: utf-8 -*-

'''
@Time    : 2020/12/08 16:24
@Author  : yuhui
@Email   : [email protected]
@FileName: numpy_3.py
@Software: PyCharm
'''

"""20【numpy中的nan和常用方法】numpy中填充nan"""

import numpy as np
import matplotlib.pyplot as plt

# 解决中文乱码
plt.rcParams["font.sans-serif"]=["KaiTi"]
plt.rcParams["font.family"]="sans-serif"
# 解决符号无法显示的问题
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像时负号'-'显示为方块的问题

"""设置图形大小和图片品质"""
fig=plt.figure(
    figsize=(16,9),
    dpi=100,
)

us_file_path=r"D:\Python\数据分析\数据分析2\data\us.csv"

us=np.loadtxt(us_file_path,  # 文件路径
              dtype="int32",  # 数据类型
              delimiter=",",  # 分隔符
              skiprows=1  # 跳过开头的几行
              )

us_comments=us  # us的评论数量  所有的行  第0列

"""绘制直方图"""

# 打印出最大值和最小值  根据最大值和最小值确定出组距,进而确定组数
# print(us_comments.max(),us_comments.min())  # 4996 117

# 组距
group_spacing=17*41
# 4996-117=4879=7*17*41
# 组数
num_bins=(us_comments.max()-us_comments.min())//group_spacing  # =7*17*41/(17*41)=7  # 整数

# 绘制直方图
plt.hist(us_comments,num_bins,
         color="#6495ED",  # 颜色
         )

"""设置x轴刻度"""
plt.xticks(range(min(us_comments),max(us_comments)+group_spacing,group_spacing))

"""绘制网格线"""
plt.grid(
    linestyle=":",  # 线型
    color="#6495ED",  # 颜色  CornflowerBlue	矢车菊的蓝色	#6495ED	100,149,237
    alpha=0.4,  # 透明度
)

plt.show()

例题2

希望了解英国的youtube1000的数据中视频的评论数和喜欢数的关系,应该如何绘制图形?

原始数据

英国youtube1000的数据

在这里插入图片描述

代码+分析+结果

根据题目要求,为了表现出两者(comment_totallikes)之间的关系,我们应该绘制散点图,其中横轴数据为comment_total,纵轴数据为likes

# -*- coding: utf-8 -*-

'''
@Time    : 2020/12/08 16:36
@Author  : yuhui
@Email   : [email protected]
@FileName: numpy_4.py
@Software: PyCharm
'''

"""20【numpy中的nan和常用方法】numpy中填充nan"""

import numpy as np
import matplotlib.pyplot as plt

# 解决中文乱码
plt.rcParams["font.sans-serif"]=["KaiTi"]
plt.rcParams["font.family"]="sans-serif"
# 解决符号无法显示的问题
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像时负号'-'显示为方块的问题

"""设置图形大小和图片品质"""
fig=plt.figure(
    figsize=(16,9),
    dpi=100,
)

uk_file_path=r"D:\Python\数据分析\数据分析2\data\uk.csv"

uk=np.loadtxt(uk_file_path,
              dtype="int32",
              delimiter=",",
              skiprows=1,  # 跳过第一行
              )

comments=uk[:,1]  # 横轴数据  第二列
likes=uk[:,0]  # 纵轴数据  第一列

"""绘制散点图"""
plt.scatter(comments,likes)

plt.show()


结果如下

在这里插入图片描述
在这里插入图片描述

为什么这个散点图的规律会这么明显呢?

因为这数据是我自己做的:先通过随机数生成数据,然后对和数据进行升序排列,最后在写代码运行的时候就出现了这样的效果。

其实数据并不重要,重要的是我们处理数据的方法,掌握了方法之后,以后在面对这样的例题时我们就知道应该如何处理对应的数据了。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yuhui_2000/article/details/110548592

智能推荐

JQuery DataGrid 中文文档_datagrid文档_LEE-MCICI的博客-程序员秘密

数据表格继承$.fn.panel.defaults,使用$.fn.datagrid.defaults重载默认值。依赖关系控制面板缩放链接按钮分页使用方法table id="tt">table>  $('#tt').datagrid({      url:'datagrid_data.js

Tensor的索引与切片_One_T.的博客-程序员秘密

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录1.Numpy风格的索引2. 范围式索引 用冒号实现3. Selective Indexing1.Numpy风格的索引可以在一个方括号里写完所有索引,之间用逗号隔开就行import tensorflow as tfa = tf.random.normal([4, 28, 28, 3])print(a[1].shape)print(a[2, 3].shape)print(a[2, 4, 7].shape)print

RK3288:linux系统中MIPI接口的5寸LCD显示屏的调试_为了遇见你666的博客-程序员秘密

RK3288的LCD调试,根据屏幕规格书对dts作相应的修改基本都可点亮,配置也较为简单Platform: RockchipSoc: RK3288System: linux(buidroot)IC:NT35523内核:4.4先做一些准备工作,多看看LCD的手册提炼出来关键信息是:Hactive = 800 ,水平...

Android studio中的显式Intent和隐式Intent_android studio在第一个界面中包含第二个按钮,点击按钮以隐式intent方式打开第三_渴鱼的博客-程序员秘密

啊。肯德基绝对是这个世界上最伟大的发明,我已经在这里呆了将近六个小时了。。。虽然没有网(防止我这种人在肯德基蹭的时间太长了,所以就限制了一下下免费WIFI的使用时间也是可以理解的,hhhh)。 还有,Shift+Enter也是代码世界最伟大的发明,为什么Word里面不行?想要实现活动之间的跳转,我们至少也要有两个活动,之前我们有一个FirstActivity了,想在我们new一个Second...

KafuKa:代码实现_茂密头发的源猴的博客-程序员秘密

1:topic ,分区,groupID影响着分区当更换了groupID,以前没有记录过就从头开始消费(earliest),消费完毕,就会记录下来,在读就不会重复读取,//earliest:从头开始 --from-beginning //latest:从消费者启动之后当是latest,即使更换了groupID,也不会读取数据,消费者第一次启动才会读取数据2://props.setProperty("enable.auto.commit", "false") // 不让kafka...

SAS函数学习笔记——字符操作_sas 字符处理函数_Miya_o00的博客-程序员秘密

一、字符变量的存储长度SAS怎样定义字符变量的存储长度?DATA EXAMPLE1; INPUT GROUP $ @10 STRING $3.; LEFT = 'X '; /* X和4个空格 */ RIGHT = ' X'; /* 4个空格和X */ SUB = SUBSTR(GROUP,1,2); REP = REPEAT(GROUP,1);DATALINES;ABCDEFGH 123XXX 4Y 5;/*

随便推点

WPF DataGrid自定义样式模板 列表头分隔线 滚动条滑块大小设定 动态数据绑定和更新_datagridcolumnheaderspresenter_抹香茶的博客-程序员秘密

[ 效果图回去放,代码在后面 ][ 用到的一些定义如果没有附代码可以随便写个看下效果,因为直接从项目中copy出来的,难免漏掉点点... ]首先,有几点需要注意:1.表头样式 [ DataGridColumnHeader ]  默认带分割线,但每列表头左右分割线都占1px,也就是说假如有三列:a.  表格最左、右边应该不需要分割线,但默认的有1pxb.  中间需要1px分割线,但默认有2px(相邻...

java的数列极差_数列极差问题(the problem of sequence biggest difference)_史高拔的博客-程序员秘密

#include #include #include //we use the list container , because it is easy to sort and get the biggest number and smallest numberusing namespace std;void sequenceBiggestLess(list a, list b){a.sort...

螺旋矩阵(回型矩阵)_平头哥阿威的博客-程序员秘密

螺旋矩阵给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例 1:输入:[[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ]]输出: [1,2,3,6,9,8,7,4,5]示例 2:输入:[[1, 2, 3, 4],[5, 6, 7, 8],[9,10,11,12]]输出: [1,2,3,...

sd卡无法启动及zc706更改主频后可以进入uboot无法启动kernel的坑_weixin_30776545的博客-程序员秘密

好长的标题 +_+1.sd卡无法启动起因:kernel底下通过dd测试速度,擦写了sd卡,再启动时发现无法启动于是重新格式化,再将BOOT.bin 相关dtb u-rootfs zImage和ubuntu-20190610.tar.bz2拷贝入第一分区,发现依旧无法启动格式化一开始在windows底下做,之后在ubuntu下fdisk都不行。另一张sd卡完全一样(wind...

python中使用xlrd、xlwt库以及openpyxl库读写excel(很不错)_outws.cell_卓玛cug的博客-程序员秘密

http://blog.csdn.net/u013816144/article/details/53317577本文内容主要是:1、python中使用xlrd、xlwt库读写excel(xls)浅析2、python中使用openpyxl库读写excel(xlsx)浅析(亲测推荐使用openpyxl库,解决了问题:ValueError: row index was 65536, n...

ArchLinux安装(BIOS)_weixin_30344995的博客-程序员秘密

ArchLinux安装(BIOS)说在前头:在经历过无数次的失败尝试过后总结出的可用的安装过程(比官方的简单一点)官方安装指导一.连接网络1.连接# wifi-menu2.检查是否联通(ctrl+c停止)# ping www.baidu.com3.远程安装注:连接上网络之后可以通过远程链接(同一个网络下)在另一台电脑上进行安装操作(可方便复制代码),如不想这么做请忽略这一步骤...

推荐文章

热门文章

相关标签