1. 程式人生 > >python pandas 如何找到NaN、缺失值或者某些元素的索引名稱以及位置,np.where的使用

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

我們在處理資料的時候,經常需要檢查資料的質量,也需要知道出問題的資料在哪個位置。我找了很久,也嘗試了很多辦法,都沒能找到一種非常直接的函式,本文所要介紹的是一種我認為比較方便的方法: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