numpy判断数值类型、过滤出数值型数据的方法

numpy是无法直接判断出由数值与字符混合组成的数组中的数值型数据的,因为由数值类型和字符类型组成的numpy数组已经不是数值类型的数组了,而是dtype='<U11'。

1、math.isnan也不行,它只能判断float("nan"):

>>> import math
>>> math.isnan(1)
False
>>> math.isnan('a')
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: a float is required
>>> math.isnan(float("nan"))
True
>>> 

2、np.isnan不可用,因为np.isnan只能用于数值型与np.nan组成的numpy数组:

>>> import numpy as np
>>> test1=np.array([1,2,'aa',3])
>>> np.isnan(test1)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could
 not be safely coerced to any supported types according to the casting rule ''sa
fe''
>>> test2=np.array([1,2,np.nan,3])
>>> np.isnan(test2)
array([False, False, True, False], dtype=bool)
>>> 

解决办法:

方法1:将numpy数组转换为python的list,然后通过filter过滤出数值型的值,再转为numpy, 但是,有一个严重的问题,无法保证原来的索引

>>> import numpy as np
>>> test1=np.array([1,2,'aa',3])
>>> list1=list(test1)
>>> def filter_fun(x):
... try:
...  return isinstance(float(x),(float))
... except:
...  return False
...
>>> list(filter(filter_fun,list1))
['1', '2', '3']
>>> np.array(filter(filter_fun,list1))
array(<filter object at 0x0339CA30>, dtype=object)
>>> np.array(list(filter(filter_fun,list1)))
array(['1', '2', '3'],
 dtype='<U1')
>>> np.array([float(x) for x in filter(filter_fun,list1)])
array([ 1., 2., 3.])
>>> 

方法2:利用map制作bool数组,然后再过滤数据和索引:

>>> import numpy as np
>>> test1=np.array([1,2,'aa',3])
>>> list1=list(test1)
>>> def filter_fun(x):
... try:
...  return isinstance(float(x),(float))
... except:
...  return False
...
>>> import pandas as pd
>>> test=pd.DataFrame(test1,index=[1,2,3,4])
>>> test
 0
1 1
2 2
3 aa
4 3
>>> index=test.index
>>> index
Int64Index([1, 2, 3, 4], dtype='int64')
>>> bool_index=map(filter_fun,list1)
>>> bool_index=list(bool_index) #bool_index这样的迭代结果只能list一次,一次再list时会是空,所以保存一下list的结果
>>> bool_index
[True, True, False, True]
>>> new_data=test1[np.array(bool_index)]
>>> new_data
array(['1', '2', '3'],
 dtype='<U11')
>>> new_index=index[np.array(bool_index)]
>>> new_index
Int64Index([1, 2, 4], dtype='int64')
>>> test2=pd.DataFrame(new_data,index=new_index)
>>> test2
 0
1 1
2 2
4 3
>>>

以上这篇numpy判断数值类型、过滤出数值型数据的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 对pandas进行数据预处理的实例讲解

    参加kaggle数据挖掘比赛,就第一个赛题Titanic的数据,学习相关数据预处理以及模型建立,本博客关注基于pandas进行数据预处理过程.包括数据统计.数据离散化.数据关联性分析 引入包和加载数据 import pandas as pd import numpy as np train_df =pd.read_csv('../datas/train.csv') # train set test_df = pd.read_csv('../datas/test.csv') # test set

  • numpy使用技巧之数组过滤实例代码

    本文研究的主要是numpy使用技巧之数组过滤的相关内容,具体如下. 当使用布尔数组b作为下标存取数组x中的元素时,将收集数组x中所有在数组b中对应下标为True的元素.使用布尔数组作为下标获得的数组不和原始数组共享数据空间,注意这种方式只对应于布尔数组(array),不能使用布尔列表(list). >>> x = np.arange(5,0,-1) >>> x array([5, 4, 3, 2, 1]) >>> x[np.array([True, F

  • numpy判断数值类型、过滤出数值型数据的方法

    numpy是无法直接判断出由数值与字符混合组成的数组中的数值型数据的,因为由数值类型和字符类型组成的numpy数组已经不是数值类型的数组了,而是dtype='<U11'. 1.math.isnan也不行,它只能判断float("nan"): >>> import math >>> math.isnan(1) False >>> math.isnan('a') Traceback (most recent call last):

  • 利用JS判断客户端类型你应该知道的四种方法

    前言 我们在写响应式布局的时候,总要考虑是否是移动端,基于这个这里总结了4种方法判断客户端是否是ios或者android.分享出来供大家参考学习,下面随着小编来一起看看详细的介绍吧. 方法如下: 1. 第一种:通过判断浏览器的userAgent,用正则来判断是否是ios和Android客户端 User Agent中文名为用户代理,是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA.它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本.操作系统及版本.浏览

  • .Net判断一个对象是否为数值类型实例

    本文实例讲述了.Net判断一个对象是否为数值类型的方法,分享给大家供大家参考.具体实现方法如下: .Net判断一个对象是否为数值类型乍一听是个很简单的事,但突然搞起来还真有点无从下手的感觉. 首先当然是通过GetType()方法反射获取其类型信息,然后对其进行分析,但是类型信息Type中并没有简单地给出这么一个属性进行判断. 老外给出的方法是: 复制代码 代码如下: public static bool IsNumeric(this Type dataType) {         if (da

  • Go语言基础知识总结(语法、变量、数值类型、表达式、控制结构等)

    一.语法结构 golang源码采用UTF-8编码.空格包括:空白,tab,换行,回车. - 标识符由字母和数字组成(外加'_'),字母和数字都是Unicode编码. - 注释: 复制代码 代码如下: /* This is a comment; no nesting */ // So is this. 二.字面值(literals)类似C语言中的字面值,但数值不需要符号以及大小标志: 复制代码 代码如下: 23 0x0FF 1.234e7类似C中的字符串,但字符串是Unicode/UTF-8编码的

  • 浅谈Java数值类型的转换与强制转换

    数值类型之间的转换 6个实心箭头箭头表示无信息丢失的转换; 3个虚箭头表示可能有精度损失的转换. 当使用上面两个数值进行二元操作时,先要将两个操作数转换为同一类型,然后再进行计算. 规则:`两个数中小类型的值将自动转换为大类型的值. 小转大可以,但是大转小会损失精度,则需要强制转换. 强制类型转换 语法格式 在圆括号中给出想要转换的目标类型,后面紧跟待转换的变量名. 例: double m = 9.99; int n = (int)m; 其中n的值为9. 强制类型转换通过截断小数部分将浮点值转换

  • JavaScript数值类型知识汇总

    整数 十进制 二进制 以零为开头,后面接一个小写或大写的拉丁文字母B(0b或者是0B) 八进制 以0开头,然后是八进制数字序列(0-7) , 如果字面值中的数值超出范围,那么前导0将被忽略,后面的数值当作十进制解析. 十六进制 十六进制字面值的前两位必须是 0x,后跟任何十六进制数字(0-9 及 A-F).其中,字母 A-F可以大写,也可以小写: 浮点数 保存浮点数需要的内存空间是保存整数值的两倍,因此ECMAScript会不失时机的将浮点数转换为整数值. var floatNum1 = 1.;

  • C语言中字符串与各数值类型之间的转换方法

    C语言的算法设计中,经常会需要用到字符串,而由于c语言中字符串并不是一个默认类型,其标准库stdlib设计了很多函数方便我们处理字符串与其他数值类型之间的转换. 首先放上一段展示各函数使用的代码,大家也可以copy到自己的机器上运行观察 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int num=183; char str[3]; //itoa函数将整型转换为字符串数值类型 it

  • Go语言strconv包实现字符串和数值类型的相互转换

    在实际开发中我们往往需要对一些常用的数据类型进行转换,如 string.int.int64.float 等数据类型之间的转换,Go语言中的 strconv 包为我们提供了字符串和基本数据类型之间的转换功能. strconv 包中常用的函数包括 Atoi().Itia().parse 系列函数.format 系列函数.append 系列函数等,下面就来分别介绍一下. string 与 int 类型之间的转换 字符串和整型之间的转换是我们平时编程中使用的最多的,下面就来介绍一下具体的操作. Itoa

  • JS正则表达式匹配检测各种数值类型(数字验证)

    验证数字的正则表达式集 验证数字:^[0-9]*$ 验证n位的数字:^\d{n}$ 验证至少n位数字:^\d{n,}$ 验证m-n位的数字:^\d{m,n}$ 验证零和非零开头的数字:^(0|[1-9][0-9]*)$ 验证有两位小数的正实数:^[0-9]+(.[0-9]{2})?$ 验证有1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$ 验证非零的正整数:^\+?[1-9][0-9]*$ 验证非零的负整数:^\-[1-9][0-9]*$ 验证非负整数(正整数 + 0) ^\d

  • 浅谈python 四种数值类型(int,long,float,complex)

    Python支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点实际值)complex (复数),本文章向码农介绍python 四种数值类型,需要的朋友可以参考一下. 数字数据类型存储数值.他们是不可改变的数据类型,这意味着改变数字数据类型的结果,在一个新分配的对象的值. Number对象被创建,当你给他们指派一个值.例如: var1 = 1 var2 = 10 您也可以删除数字对象的参考,使用del语句. del语句的语法是: del var1[,var2[,var3[

随机推荐