pandas 17 關於nan的處理

2022-08-03 07:09:11 字數 3557 閱讀 1484

在pandas中有個另類的存在就是nan,解釋是:not a number,不是乙個數字,但是它的型別確是乙個float型別。numpy中也存在關於nan的方法,如:np.nan

對於pandas中nan的處理,簡單的說有以下幾個方法。

檢視是否是nan, s1.isnull() 和 s1.notnull()

丟棄有nan的索引項,s1.dropna()

將nan填充為其他值,df2.fillna()

import numpy as np

import pandas as pd

from pandas import series, dataframe

n = np.nan

print(type(n)) # m = 1

print(n+m) # nan 任何數字和nan進行計算,都是nan

# nan in series

s1 = series([1, 2, np.nan, 3, 4], index=['a', 'b', 'c', 'd', 'e'])

print(s1)

'''a 1.0

b 2.0

c nan

d 3.0

e 4.0

dtype: float64

'''print(s1.isnull()) # 返回 bool值,是 nan 的話,返回true

'''a false

b false

c true

d false

e false

dtype: bool

'''print(s1.notnull()) # 非 nan , 返回true

'''a true

b true

c false

d true

e true

dtype: bool

'''# 去掉 有 nan 的索引項

print(s1.dropna())

'''a 1.0

b 2.0

d 3.0

e 4.0

dtype: float64

'''# nan in dataframe

df = dataframe([[1, 2, 3], [np.nan, 5, 6], [7, np.nan, 9], [np.nan, np.nan, np.nan]])

print(df)

''' 0 1 2

0 1.0 2.0 3.0

1 nan 5.0 6.0

2 7.0 nan 9.0

3 nan nan nan

'''print(df.isnull()) # df.notnull() 同理

''' 0 1 2

0 false false false

1 true false false

2 false true false

3 true true true

'''# 去掉 所有 有 nan 的 行, axis = 0 表示 行方向

df1 = df.dropna(axis=0)

print(df1)

''' 0 1 2

0 1.0 2.0 3.0

'''# 表示在 列 的方向上。

df1 = df.dropna(axis=1)

print(df1)

'''mpty dataframe

columns:

index: [0, 1, 2, 3]

'''# any 只要有 nan 就會刪掉。 all 是必須全是nan才刪除

df1 = df.dropna(axis=0, how='any')

print(df1)

''' 0 1 2

0 1.0 2.0 3.0

'''# any 只要有 nan 就會刪掉。 all 全部是nan,才會刪除

df1 = df.dropna(axis=0, how='all')

print(df1)

''' 0 1 2

0 1.0 2.0 3.0

1 nan 5.0 6.0

2 7.0 nan 9.0

'''df2 = dataframe([[1, 2, 3, np.nan], [2, np.nan, 5, 6], [np.nan, 7, np.nan, 9], [1, np.nan, np.nan, np.nan]])

print(df2)

''' 0 1 2 3

0 1.0 2.0 3.0 nan

1 2.0 nan 5.0 6.0

2 nan 7.0 nan 9.0

3 1.0 nan nan nan

'''print(df2.dropna(thresh=none))

'''empty dataframe

columns: [0, 1, 2, 3]

index:

'''print(df2.dropna(thresh=2)) # thresh 表示乙個範圍,如:每一行的nan > 2,就刪除

''' 0 1 2 3

0 1.0 2.0 3.0 nan

1 2.0 nan 5.0 6.0

2 nan 7.0 nan 9.0

'''# 將nan進行填充

print(df2.fillna(value=1))

''' 0 1 2 3

0 1.0 2.0 3.0 1.0

1 2.0 1.0 5.0 6.0

2 1.0 7.0 1.0 9.0

3 1.0 1.0 1.0 1.0

'''# 可以 為指定列 填充不同的 數值

print(df2.fillna(value=)) # 指定每一列 填充的數值

''' 0 1 2 3

0 1.0 2.0 3.0 3.0

1 2.0 1.0 5.0 6.0

2 0.0 7.0 2.0 9.0

3 1.0 1.0 2.0 3.0

'''# 以下兩個例子需要說明的是:對dataframe進行dropna,原來的dataframe不會改變

print(df1.dropna())

''' 0 1 2

0 1.0 2.0 3.0

'''print(df1)

''' 0 1 2

0 1.0 2.0 3.0

1 nan 5.0 6.0

2 7.0 nan 9.0

'''

pandas中關於nan的處理

在pandas中有個另類的存在就是nan,解釋是 not a number,不是乙個數字,但是它的型別確是乙個float型別。numpy中也存在關於nan的方法,如 np.nan 對於pandas中nan的處理,簡單的說有以下幾個方法。檢視是否是nan,s1.isnull 和 s1.notnull ...

關於NaN的比較

wtf?nan nan,返回的結果是false?也許這是因為我們沒有使用嚴格等價 操作?var x math.sqrt 2 var y math.log 1 console.log x y false也不對。因為有很多方法來表示乙個非數字,所以乙個非數字不會等於另乙個為nan的非數字,它還是有一定道...

關於js new Date 出現NaN 的分析

簡介 在乙個專案中需要進行日期的格式化,後台傳到前端是時間的整數 date.gettime 當後台資料返回字串時,發現轉換日期時在ie下變成nan,但是真的是這樣嗎?接下來我們慢慢分析。此nan不為nan 程式 如下 var date new date d if date date.getfully...