2.新特性
3.缺失值的運算特性及填充
參考pandas中缺失值有三種,np.nan,none,及針對時間的缺失值型別,nat,下面分開講解這三種型別。
首先是np.nan,由於pandas是基於numpy的,numpy的缺失值型別就是pandas最常見的缺失值類。但這個np.nan有大量問題,分下面幾點。
none比np.nan好一點,有如下幾點:
在時間型別**現缺失值時,不管是np.nan還是none,都會轉為nat,這是時間缺失值的特殊缺失值型別。
為了解決原pandas中缺失值資料型別造成的問題,pandas 1.0中新引進int64,boolean,string,三種新資料型別,這三種資料型別叫做nullable型資料,對缺失值有統一管理。
s_new = pd.series([1
,2], dtype=
"int64"
)s_new[1]
= np.nan
s_new
011
dtype: int64
在新資料型別下,出現缺失值會統一顯示為,且數值型別不會改變
s_new[1]
=none
s_new01
1dtype: int64
這三種資料型別的特點在於,有缺失值並不會改變其資料型別。
此外,對於stringl型別資料,和object型別的一點重要區別就在於,在呼叫字元方法後,string型別返回的是nullable型別,object則會根據缺失型別和資料型別而改變
convert_dtypes方法
這個函式的功能往往就是在讀取資料時,就把資料列轉為nullable型別,是1.0的新函式,使用十分方便。
pd.read_csv(
'data/table_missing.csv'
).convert_dtypes(
).dtypes
out[73]
:school string
class string
id int64
gender string
address string
height int64
weight int64
math float64
physics string
dtype:
object
在進行資料統計時,使用求和函式,缺失值會被當為0計算,乘法則會當為1計算,其他情況會跳過缺失值。
fillna方法
(a)值填充與前後向填充(分別與ffill方法和bfill方法等價)
值填充
df[
'physics'
].fillna(
'missing'
).head(
)0 a+
1 b+
2 b+
3 missing
4 a-
name: physics, dtype:
object
前後填充
#ffill 表示使用缺失值前乙個非缺失值的資料填充,bfill則表示後乙個值
df['physics'
].fillna(method=
'ffill'
).head(
)
(b)填充中的對齊特性
這裡的對齊特性,指的是只填充返回結果中的列。
2.dropna方法
dropna方法有三個引數,軸的方向axis,刪除方法how,和判斷區域subset
(a)axis=0,1表示的按行看還是按列看
df_d = pd.dataframe(
)df_d.dropna(axis=0)
a b c
0 nan nan 3
1 nan 3.0
22 nan 2.0
1a b c
返回結果為空,因為每一行都有缺失值
(b) how引數(可以選all或者any,表示全為缺失去除和存在缺失去除)
in [89]
:df_d.dropna(axis=
1,how=
'all'
)out[89]
: b c
0 nan 3
13.022
2.01
(c)subset引數(即在某一組列範圍中搜尋缺失值)
in [90]
:df_d.dropna(axis=
0,subset=
['b'
,'c'])
out[90]
: a b c
1 nan 3.0
22 nan 2.0
1
(a)索引無關的線性插值
預設狀態下,interpolate會對缺失的值進行線性插值
in [91]
:s = pd.series([1
,10,15
,-5,
-2,np.nan,np.nan,28]
)sout[91]
:01.01
10.0
215.03-
5.04
-2.0
5 nan
6 nan
728.0
dtype: float64
這種插值方法與索引無關,會造成並不是線性的結果
s.interpolate(
)out[92]
:01.01
10.0
215.03-
5.04
-2.0
58.0
618.0
728.0
dtype: float64
加入時間索引或者索引,會取得真的線性插值結果
s.interpolate(method=
'index'
).plot(
)
索引為時間時
s_t = pd.series([0
,np.nan,10]
,index=
[pd.timestamp(
'2012-05-01'
),pd.timestamp(
'2012-05-07'
),pd.timestamp(
'2012-06-03')]
)s_t.interpolate(method=
'time'
)
ser = pd.series(np.arange(1,
10.1
,.25)**
2+ np.random.randn(37)
)missing = np.array([4
,13,14
,15,16
,17,18
,20,29
])ser[missing]
= np.nan
methods =
['linear'
,'quadratic'
,'cubic'
]df = pd.dataframe(
)df.plot(
)
插值的一些引數設定
(a)limit表示最多插入多少個
s = pd.series([1
,np.nan,np.nan,np.nan,5]
)s.interpolate(limit=2)
01.0
12.0
23.0
3 nan
45.0
dtype: float64
(b)limit_direction表示插值方向,可選forward,backward,both,預設前向
s = pd.series(
[np.nan,np.nan,
1,np.nan,np.nan,np.nan,
5,np.nan,np.nan,])
s.interpolate(limit_direction=
'backward')0
1.01
1.02
1.03
2.04
3.05
4.06
5.07 nan
8 nan
dtype: float64
(c)插值區域引數設定
s = pd.series(
[np.nan,np.nan,
1,np.nan,np.nan,np.nan,
5,np.nan,np.nan,])
s.interpolate(limit_area=
'inside'
)0 nan
1 nan
21.0
32.0
43.0
54.0
65.0
7 nan
8 nan
dtype: float64
``none』』:沒有填充限制。『inside』:僅填充有效值包圍的nan(插)。『外部』:僅在有效值之外填充nan(外推)。
[1] datawhalechina/joyful-pandas
Pandas 缺失值處理
二 處理缺失值 首先拿到乙份資料,以dataframe提取後,要檢視缺失值的情況 import pandas as pd df pd.read csv df.isnull 獲得true,false的返回值 df.isnull sum 判斷缺失的數量常用此介面來快速判斷各特徵的缺失值情況!df.dro...
Pandas缺失值處理
判斷資料是否為nan pd.isnull df pd.notnull df 判斷缺失值是否存在 np.all pd.notnull data 返回false代表有空值 np.any pd.isnull data 返回true代表有空值處理方式 2 替換缺失值 fillna value,inplace...
Pandas的缺失值處理
處理方式 不是缺失值nan,有預設標記的 判斷資料是否為nan pd.isnull df pd.notnull df pd.isna df 讀取資料 movie pd.read csv date imdb movie data.csv 第一種 刪除 pandas刪除缺失值,使用dropna的前提是,...