數(shù)據(jù)分析特征工程之缺失值填充

數(shù)據(jù)分析特征工程之缺失值填充

平均值補(bǔ)值和fillna的bfill和ffill補(bǔ)值。

對(duì)于大方差數(shù)據(jù)我們通常采用bfill和ffill隆嗅;對(duì)于小方差數(shù)據(jù)我們通常用平均值補(bǔ)值。

In [1]:

#先創(chuàng)建一個(gè)數(shù)據(jù)集:
import numpy as np
import pandas as pd
ser1=pd.Series(np.random.randint(3,23,20))
ser1[[2,6,11,17]]=np.nan
ser1

Out[1]:

0     19.0
1     16.0
2      NaN
3     22.0
4     18.0
5     20.0
6      NaN
7      4.0
8      7.0
9     13.0
10    19.0
11     NaN
12    20.0
13     4.0
14    15.0
15    12.0
16     7.0
17     NaN
18     3.0
19    15.0
dtype: float64

fill采用缺失值前面的值填充
In [2]:

#fill采用缺失值前面的值填充
ser1.fillna(method='ffill')

Out[2]:

0     19.0
1     16.0
2     16.0
3     22.0
4     18.0
5     20.0
6     20.0
7      4.0
8      7.0
9     13.0
10    19.0
11    19.0
12    20.0
13     4.0
14    15.0
15    12.0
16     7.0
17     7.0
18     3.0
19    15.0
dtype: float64

bfill采用缺失值后面的值填充
In [3]:

#bfill采用缺失值后面的值填充
ser1.fillna(method='bfill')

Out[3]:

0     19.0
1     16.0
2     22.0
3     22.0
4     18.0
5     20.0
6      4.0
7      4.0
8      7.0
9     13.0
10    19.0
11    20.0
12    20.0
13     4.0
14    15.0
15    12.0
16     7.0
17     3.0
18     3.0
19    15.0
dtype: float64

用平均值進(jìn)行補(bǔ)值
In [4]:

#用平均值進(jìn)行補(bǔ)值
data_inf=ser1.describe()
ser1.fillna(data_inf['mean'])

Out[4]:

0     19.000
1     16.000
2     13.375
3     22.000
4     18.000
5     20.000
6     13.375
7      4.000
8      7.000
9     13.000
10    19.000
11    13.375
12    20.000
13     4.000
14    15.000
15    12.000
16     7.000
17    13.375
18     3.000
19    15.000
dtype: float64

通過(guò)拉格朗日插值多項(xiàng)式實(shí)現(xiàn)侯繁,(即通過(guò)已知點(diǎn)缺點(diǎn)多項(xiàng)式胖喳,然后用此多項(xiàng)式去預(yù)測(cè)未知點(diǎn))python已經(jīng)有可用的內(nèi)置函數(shù)。 lagrange(x, w): 給定兩個(gè)一維數(shù)組“x”和“w”巫击,返回通過(guò)這些點(diǎn)“(x, w)”的拉格朗日插值多項(xiàng)式禀晓。

警告:這個(gè)方法在數(shù)值上是不穩(wěn)定的。不要期望能夠使用超過(guò)20點(diǎn)(通常10點(diǎn)以?xún)?nèi))坝锰,即使他們是最佳選擇粹懒。也就是要求我們?cè)诳罩祷驘o(wú)效值附近進(jìn)行Lagrange計(jì)算。

In [5]:

from scipy.interpolate import lagrange
ser1=pd.Series(np.random.randint(3,23,30))
ser1[[6,18]]=np.nan
ser1

Out[5]:

0      9.0
1     22.0
2      6.0
3     14.0
4     16.0
5     22.0
6      NaN
7     20.0
8     10.0
9     14.0
10    15.0
11    21.0
12    16.0
13    10.0
14     7.0
15    18.0
16     9.0
17    12.0
18     NaN
19     9.0
20    18.0
21    22.0
22    18.0
23    17.0
24    18.0
25     5.0
26    12.0
27     3.0
28    16.0
29     5.0
dtype: float64

In [6]:

ser1_n1=ser1[0:13].dropna(0)#在空值位‘6’前后各選6個(gè)位置點(diǎn)進(jìn)行多項(xiàng)式確定

p1=lagrange(list(ser1_n1.index),ser1_n1.values)#生成多項(xiàng)式函數(shù)

p1(6)#預(yù)測(cè)空值點(diǎn)‘6’對(duì)應(yīng)的值顷级。

Out[6]:

27.76948051917691

In [7]:

#同理對(duì)空值位‘18’進(jìn)行值預(yù)測(cè)
ser1_n1=ser1[12:25].dropna(0)

p1=lagrange(list(ser1_n1.index),ser1_n1.values)

p1(18)

Out[7]:

11.587867021560669

In [20]:

#然后用fillna把空值補(bǔ)充
ser1_after_dealing=ser1.fillna({6:27.76948051917691,18:11.587867021560669})
ser1_after_dealing

Out[20]:

0      9.000000
1     22.000000
2      6.000000
3     14.000000
4     16.000000
5     22.000000
6     27.769481
7     20.000000
8     10.000000
9     14.000000
10    15.000000
11    21.000000
12    16.000000
13    10.000000
14     7.000000
15    18.000000
16     9.000000
17    12.000000
18    11.587867
19     9.000000
20    18.000000
21    22.000000
22    18.000000
23    17.000000
24    18.000000
25     5.000000
26    12.000000
27     3.000000
28    16.000000
29     5.000000
dtype: float64

In [21]:

#補(bǔ)值后以一維數(shù)組形式返回
ser1_after_dealing.apply(lambda x:'%d'%x).values.astype(np.int32)

Out[21]:

array([ 9, 22,  6, 14, 16, 22, 27, 20, 10, 14, 15, 21, 16, 10,  7, 18,  9,
       12, 11,  9, 18, 22, 18, 17, 18,  5, 12,  3, 16,  5])

插值法填補(bǔ)缺失值

DataFrame.interpolate(method ='linear'凫乖,axis = 0,limit = None弓颈,inplace = False帽芽,limit_direction ='forward',limit_area = None翔冀,downcast = None导街,** kwargs )根據(jù)不同的方法插值。

method:默認(rèn)'linear'

  • 'linear':忽略索引并將值視為等間距纤子。這是MultiIndexes支持的唯一方法搬瑰。
  • 'time':適用于每日和更高分辨率的數(shù)據(jù),以插入給定的間隔長(zhǎng)度控硼。
  • 'index'泽论,'values':使用索引的實(shí)際數(shù)值。
  • 'pad':使用現(xiàn)有值填寫(xiě)NaN卡乾。
  • 'nearest','zero','slinear','quadratic','cubic','spline','barycentric','polynomial':傳遞給 scipy.interpolate.interp1d翼悴。'polynomial'和'spline'都要求你也指定一個(gè)order(int),例如幔妨。這些使用索引的數(shù)值鹦赎。df.interpolate(method='polynomial', order=4)

填充N(xiāo)aN在Series通過(guò)線(xiàn)性插值。

In [10]:

s = pd.Series([1, np.nan, np.nan,np.nan,100])
s

Out[10]:

0      1.0
1      NaN
2      NaN
3      NaN
4    100.0
dtype: float64

In [11]:

s.interpolate(method='linear')

Out[11]:

0      1.00
1     25.75
2     50.50
3     75.25
4    100.00
dtype: float64

In [12]:

s.interpolate(method='slinear')

Out[12]:

0      1.00
1     25.75
2     50.50
3     75.25
4    100.00
dtype: float64

填寫(xiě)NaN由填充一個(gè)系列误堡,而是填充至多兩個(gè)連續(xù)NaN在同一時(shí)間钙姊。

In [13]:

s = pd.Series([np.nan, "single_one", np.nan,"fill_two_more", np.nan, np.nan, np.nan,4.71, np.nan])
s

Out[13]:

0              NaN
1       single_one
2              NaN
3    fill_two_more
4              NaN
5              NaN
6              NaN
7             4.71
8              NaN
dtype: object

In [14]:

s.interpolate(method='pad', limit=2)

Out[14]:

0              NaN
1       single_one
2       single_one
3    fill_two_more
4    fill_two_more
5    fill_two_more
6              NaN
7             4.71
8             4.71
dtype: object

NaN通過(guò)多項(xiàng)式插值或樣條函數(shù)填充系列:“多項(xiàng)式”和“樣條”方法都要求您還指定order(int)。

In [15]:

s = pd.Series([0, 2, np.nan, 8])
s

Out[15]:

0    0.0
1    2.0
2    NaN
3    8.0
dtype: float64

In [16]:

s.interpolate(method='polynomial', order=2)

Out[16]:

0    0.000000
1    2.000000
2    4.666667
3    8.000000
dtype: float64

使用線(xiàn)性插值沿每列填充DataFrame(即埂伦,向下)。

請(qǐng)注意列'a'中的最后一個(gè)條目是如何以不同方式進(jìn)行插值的思恐,因?yàn)樵谒鬀](méi)有用于插值的條目沾谜。注意列'b'中的第一個(gè)條目是如何保留的NaN膊毁,因?yàn)樗鼪](méi)有用于插值的條目。

In [17]:

df = pd.DataFrame([(0.0,  np.nan, -1.0, 1.0),(np.nan, 2.0, np.nan, np.nan),(2.0, 3.0, np.nan, 9.0),(np.nan, 4.0, -4.0, 16.0)],columns=list('abcd'))
df

Out[17]:

a b c d
0 0.0 NaN -1.0 1.0
1 NaN 2.0 NaN NaN
2 2.0 3.0 NaN 9.0
3 NaN 4.0 -4.0 16.0

In [18]:

df.interpolate(method='linear', limit_direction='forward', axis=0)

Out[18]:

a b c d
0 0.0 NaN -1.0 1.0
1 1.0 2.0 -2.0 5.0
2 2.0 3.0 -3.0 9.0
3 2.0 4.0 -4.0 16.0

In [19]:

df['d'].interpolate(method='polynomial', order=2)

Out[19]:

0     1.0
1     4.0
2     9.0
3    16.0
Name: d, dtype: float64
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末基跑,一起剝皮案震驚了整個(gè)濱河市婚温,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌媳否,老刑警劉巖栅螟,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異篱竭,居然都是意外死亡力图,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)掺逼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吃媒,“玉大人,你說(shuō)我怎么就攤上這事吕喘∽改牵” “怎么了窥浪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵侍郭,是天一觀(guān)的道長(zhǎng)珠洗。 經(jīng)常有香客問(wèn)我撞反,道長(zhǎng)形耗,這世上最難降的妖魔是什么纬纪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任甸昏,我火速辦了婚禮蛤迎,結(jié)果婚禮上蜓陌,老公的妹妹穿的比我還像新娘觅彰。我一直安慰自己,他們只是感情好钮热,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布填抬。 她就那樣靜靜地躺著,像睡著了一般隧期。 火紅的嫁衣襯著肌膚如雪飒责。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天仆潮,我揣著相機(jī)與錄音宏蛉,去河邊找鬼。 笑死性置,一個(gè)胖子當(dāng)著我的面吹牛拾并,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼嗅义,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼屏歹!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起之碗,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蝙眶,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后褪那,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體幽纷,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年博敬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了友浸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡冶忱,死狀恐怖尾菇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情囚枪,我是刑警寧澤派诬,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站链沼,受9級(jí)特大地震影響默赂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜括勺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一缆八、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疾捍,春花似錦奈辰、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至宛裕,卻和暖如春瑟啃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背揩尸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工蛹屿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人岩榆。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓错负,卻偏偏與公主長(zhǎng)得像坟瓢,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子湿颅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容