pandas入門05---數據清洗

01 處理缺失值

pandas使用浮點值NaN(Not a Number)表示缺失值。咱們稱NaN爲容易檢測到的標識值:數組

import pandas as pd
import numpy as np

string_data = pd.Series(['aardvark', 'artichoke', np.nan, 'avocado'])
print(string_data)
print(string_data.isnull())

在pandas中,將缺失值標爲NA,意思是not available(不可用)。dom

NA數據能夠是不存在的數據或者是存在但不可觀察的數據。Python內建的None值在對象數組中也被當作NA處理。3d

string_data[0] = None
print(string_data.isnull())

01-01 過濾缺失值

dropna方法在過濾缺失值時很是有用。code

在Series中使用dropna,會返回Series中全部非空數據及其索引值。對象

data = pd.Series([1,NA, 3.5, NA, 7])
print(data.dropna())

在處理DataFrame對象時,可能須要刪除所有爲NA或包含NA的行或列。blog

dropna默認狀況下會刪除包含缺失值的行:索引

data1 = pd.DataFrame([[1. ,6.5, 3.],[1., NA, NA],[NA, NA, NA],[NA, 6.5, 3.]])
cleaned = data1.dropna()
print(data1)
print(cleaned)

傳入how = 'all'時,能夠刪除全部值均爲NA的行:string

data2 = pd.DataFrame([[1., 6.5, 3.], [1., NA, NA], [NA, NA, NA], [NA, 6.5, 3.]])
cleaned = data2.dropna(how='all')
print(data2)
print(cleaned)

若是須要用一樣的方式刪除列,傳入參數axis=1:pandas

data2[4] = NA
print(data2)

cleaned = data2.dropna(axis=1,how='all')
print(cleaned)

01-02 補全缺失值

大多數狀況下,使用fillna方法來補全缺失值。調用fillna時,能夠使用一個常數來替代缺失值。ast

df = pd.DataFrame(np.random.randn(7,3))
df.iloc[:4, 1] = NA
df.iloc[:2, 2] = NA
print(df)
print(df.fillna(0))

能夠在調用fillna時使用字典,爲不一樣列設定不一樣的填充值:

df.fillna({1:0.5,2:0})

fillna返回的是一個新對象,可是你也能夠修改已經存在的對象。

_ = df.fillna(0, inplace=True)
print(df)

能夠將Series的平均值或中位數用於填充缺失值。

02 數據轉換

02-01 刪除重複值

data = pd.DataFrame({'k1': ['one', 'two'] * 3 + ['two'], 'k2': [1, 1, 2, 3, 3, 4, 4]})
print(data)

print(data.duplicated())

DataFrame的duplicated方法返回的是一個布爾值的Series,這個Series反應的是每一行是否存在重複(與以前出現過得行相同)狀況:

drop_duplicates返回的是DataFrame,內容是duplicated返回數組中爲False的部分:

print(data.drop_duplicates())

這些方法默認都是對列進行操做。

能夠指定數據的任何子集來檢測是否有重複。

假設咱們有一個額外的列,想基於‘k1’列去除重複值。

data['v1'] = range(7)
print(data)
print(data.drop_duplicates(['k1']))

duplicated和drop_duplicates默認都是保留第一個觀測到的值。傳入參數keep='last'將會返回最後一個:

print(data.drop_duplicates(['k1','k2'],keep='last'))