您的位置:首页 > 编程语言 > Python开发

python pandas 如何找到NaN、缺失值或者某些元素的索引名称以及位置,np.where的使用

2017-08-15 18:40 621 查看
我们在处理数据的时候,经常需要检查数据的质量,也需要知道出问题的数据在哪个位置。我找了很久,也尝试了很多办法,都没能找到一种非常直接的函数,本文所要介绍的是一种我认为比较方便的方法:np.where()

我举个例子

import pandas as pd
import numpy as np

df = pd.DataFrame(np.arange(12).reshape(4,3), index=list('abcd'), columns=list('xyz'))

In [14]:df
Out[14]:
x   y   z
a  0   1   2
b  3   4   5
c  6   7   8
d  9  10  11


比如你想找到 5 的位置,你想知道它在第几行,第几列

In [16]: np.where(df==5)
Out[16]: (array([1], dtype=int64), array([2], dtype=int64))


可以看到结果返回了一个元祖tuple,里面有两个元素,都是np.ndarray类型的,第一个是行号,第二个是指明列的位置,所以5 是在第2行,第3列

如果我们想检查数据里面掺杂的缺失值NaN的位置的,同样可以用此方法。

# 首先我们将df的第一列变成NaN
df.x = np.nan
df
Out[18]:
x   y   z
a NaN   1   2
b NaN   4   5
c NaN   7   8
d NaN  10  11

# 然后查查NaN的位置,在写这篇blog的时候我也遇到了一个奇怪的事,上面我用np.nan赋值后,然后用df == np.nan判断,结果很奇怪

In [28]: df == np.nan
Out[28]:
x      y      z
a  False  False  False
b  False  False  False
c  False  False  False
d  False  False  False

# 但是用 numpy 的另一个函数 np.isnan, 却可以判断出nan,具体原因还需要再研究研究

np.isnan(df)
Out[25]:
x      y      z
a  True  False  False
b  True  False  False
c  True  False  False
d  True  False  False

# 因此接我们最初的目的,找出NaN的位置

np.where(np.isnan(df))
Out[32]: (array([0, 1, 2, 3], dtype=int64), array([0, 0, 0, 0], dtype=int64))

np.where(np.isnan(df))[0] # 选出tuple里面的第一个元素,也就是行号
Out[33]: array([0, 1, 2, 3], dtype=int64)


但如果你觉得只知道行号,列号不能满足你的需求,还想知道元素的索引名称

# 我们现在的df是这个样子的
df
Out[34]:
x   y   z
a NaN   1   2
b NaN   4   5
c NaN   7   8
d NaN  10  11

# 加入你想知道 NaN 所在的索引,列名,只需要在前面加上 df.index, df.columns 即可

In [35]: df.index[np.where(np.isnan(df))[0]]
Out[35]: Index(['a', 'b', 'c', 'd'], dtype='object')
# df.index 是获取行名称,对应后面的[0]取行号

In [36]: df.columns[np.where(np.isnan(df))[1]]
Out[36]: Index(['x', 'x', 'x', 'x'], dtype='object')
# df.columns 是获取列名称,对应后面的[1]取列号


Over
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐