pandas小記:pandas資料規整化-缺失和冗餘資料處理
處理缺失資料
缺失資料(missing data)在大部分資料分析應用中都很常見。pandas的設計目標之一就是讓缺失資料的處理任務儘量輕鬆,pandas物件上的所有描述統計都排除了缺失資料。
pandas使用浮點NaN (Not a Number)表示浮點和非浮點陣列中的缺失資料,它只是一個便於被檢測出來的標記而已。pandas primarily uses the value np.nan to represent missing data. It is bydefault not included in computations.
NA處理方法
方法 說明
dropna 根據各標籤的中是否存在缺失資料對軸標籤進行過濾,可通過閾調節對缺失的容忍度
fillna 用指定或插方法(如ffill或bfill)填充缺失資料
isnull 返回一個含有布林的物件,這些布林表示哪些是缺失/NA,該物件的型別與源型別一樣
notnull isnull 的否定式
>>>string_data=Series(['aardvark','artichoke',np.nan,'avocado'])
>>> string_data
0 aardvark
1 artichoke
2 NaN
3 avocado
dtype: object
isnull()
>>> string_data.isnull()
0 False
1 False
2 True
3 False
dtype: bool
Python內建的None也會被當做NA處理
Note:使用pd函式可以直接對str型別或者float型別的nan判斷是否是pandas的nan型別:pd.isnull(df1)。
濾除缺失資料dropna
DataFrame.
(axis=0, how='any', thresh=None, subset=None, inplace=False)
對於Series,dropna返回一個僅含非空資料和索引的Series:
>>> from numpy import nan as NA
>>>data = Series([1, NA, 3.5, NA, 7])
>>>data.dropna()
0 1.0
2 3.5
4 7.0
dtype: float64
當然,也可以通過布林型索引達到這個目的data[data.notnull()]
對於DataFrame
引數how
dropna預設丟棄任何含有缺失的行how='any':
>>>data = pd.DataFrame([[1., 6.5, 3.],[1., NA,NA],[NA, NA, NA], [NA, 6.5, 3.1]])
>>>data.dropna()
0 1 2
0 1.0 6.5 3.0
傳入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.1
subset引數:
指定只有subset中的列存在nan才丟棄行。如只刪除case_id列存在nan的行:data_df = data_df.dropna(subset=['case_id'])
axis引數:
丟棄列而不是行:axis=1
thresh引數:
只留下 至少有thresh個 非NA值的觀測資料。
>>>df = df.DataFrame(np.random.randn(7, 3))
>>>df
0 1 2
0 -0.776521 NaN NaN
1 -1.179873 NaN NaN
2 -0.479620 NaN NaN
3 -0.214146 NaN -0.387709
4 0.864021 NaN -1.198854
5 -1.654861 -1.367580 -1.010236
6 0.454499 0.938988 -0.511850
>>>df.dropna(thresh=3)
0 1 2
5 -1.654861 -1.367580 -1.010236
6 0.454499 0.938988 -0.511850
dropna有一個缺陷就是不能指定什麼值算是na的,這個只能在讀取資料時指定,如pandas.read_excel中的引數na_values。
填充缺失資料fillna
若不想濾除缺失資料(有可能會丟棄跟它有關的其他資料),而是希望通過其他方式填補那些“空洞”。對於大多數情況而言,fillna方法是最主要的函式。
fillna函式的引數
value 用於填充缺失的標量或字典物件
method 插方式。如果函式呼叫時未指定其他引數的話,預設為“ffill”
axis 待填充的軸,預設axis=0
inplace 修改呼叫者物件而不產生副本
limit (對於前向和後向填充)可以連續填充的最大數量
通過一個常數呼叫fillna就會將缺失替換為那個常數:
>>> df.fillna(0)
若是通過一個字典呼叫fillna,就可以實現對不同的列填充不同的
>>> df.fillna({1: 0.5, 3: -1})
fillna預設會返回新物件,但也可以對現有物件進行就地修改:
#總是返回被填允物件的引用
>>> _ = df.fillna(0, inplace=True)
對reindex有效的那些插方法也可用於fillna:
>>> df = DataFrame(np.random.randn(6, 3))
>>>df.ix[2:,1] = NA; df.ix[4:,2] = NA
>>>df.fillna(method='ffill')
>>>df.fillna(method='ffill', limit=2)
傳入Series 的平均或中位數:
>>>data = Series([1., NA, 3.5, NA, 7])
>>>data.fillna(data.mean())
0 1.000000
1 3.833333
2 3.500000
3 3.833333
4 7.000000
dtype: float64
冗餘資料處理Duplicate Data
DataFrame的duplicated方法返回一個布林型Series,表示各行是否重複行。而 drop_duplicates方法,它用於返回一個移除了重複行的DataFrame
data.drop_duplicates(inplace=True) 或者data = data.drop_duplicates()
只對某一列有重複則刪除:df.drop_duplicates(subset=0, inplace=True)