停更了幾周的python基礎(chǔ)學(xué)習(xí),今天我們跟上,接下來(lái)幾周將重點(diǎn)學(xué)習(xí)如何處理缺失數(shù)據(jù)、重復(fù)數(shù)據(jù)、字符串操作和其它分析數(shù)據(jù)轉(zhuǎn)換的工具
缺失數(shù)據(jù)
缺失數(shù)據(jù)在pandas中呈現(xiàn)的方式有些不完美,但對(duì)于大多數(shù)用戶可以保證功能正常。對(duì)于數(shù)值數(shù)據(jù),pandas使用浮點(diǎn)值NaN(Not a Number)表示缺失數(shù)據(jù)。在python中其為哨兵值,可以方便的檢測(cè)出來(lái):
導(dǎo)入神庫(kù)
import pandas as pd
import numpy as np
string_data=pd.Series(['aardvark', 'artichoke', np.nan, 'avocado'])
## 判斷是否為缺失值
string_data.isnull()
0 False
1 False
2 True
3 False
第二種方法 判斷
pd.isna(string_data)
0 False
1 False
2 True
3 False
dtype: bool
在pandas中,采用了R語(yǔ)言中的慣用法,即將缺失值表示為NA,它表示不可用not available 。在統(tǒng)計(jì)應(yīng)用中,NA數(shù)據(jù)可能是不存在的數(shù)據(jù)或者雖然存在,但是沒(méi)有觀察到(例如,數(shù)據(jù)采集中發(fā)生了問(wèn)題)。當(dāng)進(jìn)行數(shù)據(jù)清洗以進(jìn)行分析時(shí),最好直接對(duì)缺失數(shù)據(jù)進(jìn)行分析,以判斷數(shù)據(jù)采集的問(wèn)題或缺失數(shù)據(jù)可能導(dǎo)致的偏差。
Python內(nèi)置的None值在對(duì)象數(shù)組中也可以作為NA:
string_data[0]==None ##判斷
False
string_data[0]=None ## 賦值
string_data
0 None
1 artichoke
2 NaN
3 avocado
dtype: object
pd.isnull(string_data)
0 True
1 False
2 True
3 False
dtype: bool
濾除缺失數(shù)據(jù)
過(guò)濾掉缺失數(shù)據(jù)的辦法有很多種。你可以通過(guò)pandas.isnull 或布爾索引的手工方法,但dropna可能會(huì)更實(shí)用一些。對(duì)于一個(gè)Series ,dropna返回一個(gè)僅含非空數(shù)據(jù)和索引值的Series :
from numpy import nan as NA
data=pd.Series([1,NA,3,NA,7])
data.dropna()
0 1.0
2 3.0
4 7.0
dtype: float64
#這等價(jià)于:
data[data.notna()]
0 1.0
2 3.0
4 7.0
dtype: float64
而對(duì)于DataFrame對(duì)象,事情就有點(diǎn)復(fù)雜了。你可能希望丟棄全NA或含有
NA的行或列。dropna默認(rèn)丟棄任何含有缺失值的行:
data = pd.DataFrame([[1., 6.5, 3.], [1., NA, NA],
[NA, NA, NA], [NA, 6.5, 3.]])
data
| 0 | 1 | 2 |
---|
0 | 1.0 | 6.5 | 3.0 |
---|
1 | 1.0 | NaN | NaN |
---|
2 | NaN | NaN | NaN |
---|
3 | NaN | 6.5 | 3.0 |
---|
clean_data=data.dropna()
clean_data
### 可以看出,默認(rèn)刪除的是含有NA值的行
##傳入how='all' 將只丟棄全為NA的那些行:
data.dropna(how='all')
| 0 | 1 | 2 |
---|
0 | 1.0 | 6.5 | 3.0 |
---|
1 | 1.0 | NaN | NaN |
---|
3 | NaN | 6.5 | 3.0 |
---|
# 如果按照列刪除缺失值,只需傳入axis=1 即可:
data.dropna(how='all',axis=1)
| 0 | 1 | 2 |
---|
0 | 1.0 | 6.5 | 3.0 |
---|
1 | 1.0 | NaN | NaN |
---|
2 | NaN | NaN | NaN |
---|
3 | NaN | 6.5 | 3.0 |
---|
另一個(gè)濾除DataFrame行的問(wèn)題涉及時(shí)間序列數(shù)據(jù)。假設(shè)你只想留下一部分
觀測(cè)數(shù)據(jù),可以用thresh 參數(shù)實(shí)現(xiàn)此目的:
df=pd.DataFrame(np.random.randn(7,3))
df
| 0 | 1 | 2 |
---|
0 | -0.475024 | 0.808877 | 0.846899 |
---|
1 | 1.985728 | -0.498647 | -0.461880 |
---|
2 | -0.121965 | -0.647125 | 1.897084 |
---|
3 | 0.408052 | -0.491282 | 0.398916 |
---|
4 | -0.272506 | 1.000522 | -0.114962 |
---|
5 | -0.171780 | 0.501524 | -0.362652 |
---|
6 | -1.376714 | 0.138974 | -0.152652 |
---|
df.iloc[:4,1]=NA
df.iloc[:2,2]
0 0.846899
1 -0.461880
Name: 2, dtype: float64
df.iloc[:2,2]=NA
df
| 0 | 1 | 2 |
---|
0 | -0.475024 | NaN | NaN |
---|
1 | 1.985728 | NaN | NaN |
---|
2 | -0.121965 | NaN | 1.897084 |
---|
3 | 0.408052 | NaN | 0.398916 |
---|
4 | -0.272506 | 1.000522 | -0.114962 |
---|
5 | -0.171780 | 0.501524 | -0.362652 |
---|
6 | -1.376714 | 0.138974 | -0.152652 |
---|
df.dropna()
| 0 | 1 | 2 |
---|
4 | -0.272506 | 1.000522 | -0.114962 |
---|
5 | -0.171780 | 0.501524 | -0.362652 |
---|
6 | -1.376714 | 0.138974 | -0.152652 |
---|
df.dropna(axis=1)
| 0 |
---|
0 | -0.475024 |
---|
1 | 1.985728 |
---|
2 | -0.121965 |
---|
3 | 0.408052 |
---|
4 | -0.272506 |
---|
5 | -0.171780 |
---|
6 | -1.376714 |
---|
df.dropna(thresh=3) ###thresh 代表的是刪除索引從0開(kāi)始到索引為thresh為止
| 0 | 1 | 2 |
---|
4 | -0.272506 | 1.000522 | -0.114962 |
---|
5 | -0.171780 | 0.501524 | -0.362652 |
---|
6 | -1.376714 | 0.138974 | -0.152652 |
---|
填充缺失數(shù)據(jù)
你可能不想濾除缺失數(shù)據(jù)(有可能會(huì)丟棄跟它有關(guān)的其他數(shù)據(jù)),而是希望通過(guò)其他方式填補(bǔ)那些“空洞”。對(duì)于大多數(shù)情況而言,fillna方法是最主要的函數(shù)。通過(guò)一個(gè)常數(shù)調(diào)用fillna就會(huì)將缺失值替換為那個(gè)常數(shù)值:
### 比如用0填充
df.fillna(0)
| 0 | 1 | 2 |
---|
0 | -0.475024 | 0.000000 | 0.000000 |
---|
1 | 1.985728 | 0.000000 | 0.000000 |
---|
2 | -0.121965 | 0.000000 | 1.897084 |
---|
3 | 0.408052 | 0.000000 | 0.398916 |
---|
4 | -0.272506 | 1.000522 | -0.114962 |
---|
5 | -0.171780 | 0.501524 | -0.362652 |
---|
6 | -1.376714 | 0.138974 | -0.152652 |
---|
#若是通過(guò)一個(gè)字典調(diào)用fillna,就可以實(shí)現(xiàn)對(duì)不同的列填充不同的值:
df.fillna({1:1,2:2})
| 0 | 1 | 2 |
---|
0 | -0.475024 | 1.000000 | 2.000000 |
---|
1 | 1.985728 | 1.000000 | 2.000000 |
---|
2 | -0.121965 | 1.000000 | 1.897084 |
---|
3 | 0.408052 | 1.000000 | 0.398916 |
---|
4 | -0.272506 | 1.000522 | -0.114962 |
---|
5 | -0.171780 | 0.501524 | -0.362652 |
---|
6 | -1.376714 | 0.138974 | -0.152652 |
---|
對(duì)reindexing 有效的那些插值方法也可用于fillna:
df=pd.DataFrame(np.random.randn(6,3))
df.iloc[:2,1]
0 0.341521
1 -0.236488
Name: 1, dtype: float64
df.iloc[2:,1]=NA
df
| 0 | 1 | 2 |
---|
0 | -1.308469 | 0.341521 | 0.665815 |
---|
1 | -0.343031 | -0.236488 | 3.169433 |
---|
2 | 1.651689 | NaN | 0.398313 |
---|
3 | -0.601294 | NaN | -0.284620 |
---|
4 | 1.516970 | NaN | 1.344071 |
---|
5 | -2.583564 | NaN | 0.508698 |
---|
df.iloc[3:,2]=NA
df
| 0 | 1 | 2 |
---|
0 | -1.308469 | 0.341521 | 0.665815 |
---|
1 | -0.343031 | -0.236488 | 3.169433 |
---|
2 | 1.651689 | NaN | 0.398313 |
---|
3 | -0.601294 | NaN | NaN |
---|
4 | 1.516970 | NaN | NaN |
---|
5 | -2.583564 | NaN | NaN |
---|
df.fillna(method='ffill')
| 0 | 1 | 2 |
---|
0 | -1.308469 | 0.341521 | 0.665815 |
---|
1 | -0.343031 | -0.236488 | 3.169433 |
---|
2 | 1.651689 | -0.236488 | 0.398313 |
---|
3 | -0.601294 | -0.236488 | 0.398313 |
---|
4 | 1.516970 | -0.236488 | 0.398313 |
---|
5 | -2.583564 | -0.236488 | 0.398313 |
---|
df.fillna(method='ffill', limit=2) ##表示之填充兩個(gè)
| 0 | 1 | 2 |
---|
0 | -1.308469 | 0.341521 | 0.665815 |
---|
1 | -0.343031 | -0.236488 | 3.169433 |
---|
2 | 1.651689 | -0.236488 | 0.398313 |
---|
3 | -0.601294 | -0.236488 | 0.398313 |
---|
4 | 1.516970 | NaN | 0.398313 |
---|
5 | -2.583564 | NaN | NaN |
---|
df.fillna(df[0].mean()) ## 用第一列均值填充
| 0 | 1 | 2 |
---|
0 | -1.308469 | 0.341521 | 0.665815 |
---|
1 | -0.343031 | -0.236488 | 3.169433 |
---|
2 | 1.651689 | -0.277950 | 0.398313 |
---|
3 | -0.601294 | -0.277950 | -0.277950 |
---|
4 | 1.516970 | -0.277950 | -0.277950 |
---|
5 | -2.583564 | -0.277950 | -0.277950 |
---|
df[0]
0 -1.308469
1 -0.343031
2 1.651689
3 -0.601294
4 1.516970
5 -2.583564
Name: 0, dtype: float64