1. 程式人生 > >pandas小記:pandas資料規整化-缺失和冗餘資料處理

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=0how='any'thresh=Nonesubset=Noneinplace=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)