5天10分鐘,學(xué)會數(shù)據(jù)清洗?。≒ython)

這是來自Kaggle的Data Cleaning Challenge For 5 Days!

Kaggle是國外著名的數(shù)據(jù)競賽分析平臺,對新手十分友好,這里主要記錄我在這個小挑戰(zhàn)中學(xué)到一些數(shù)據(jù)清洗方法。

kaggle鏈接:https://www.kaggle.com

第一天:缺失數(shù)據(jù)的處理(Missing Values)

  • 查看缺失數(shù)據(jù):
data.isnull().sum()
  • 填充缺失數(shù)據(jù):
# 用0填充
data.fillna(0)

# 直接使用相同標(biāo)簽下下一個數(shù)據(jù)填充
#再用 0 填充
data.fillna(method = 'bfill', axis=0).fillna(0)
  • 刪除缺失數(shù)據(jù)
data.dropna()

鏈接:
https://www.kaggle.com/rtatman/data-cleaning-challenge-handling-missing-values?utm_medium=email&utm_source=mailchimp&utm_campaign=5DDC-data-cleaning

第二天:數(shù)據(jù)縮放和歸一化(Scale and Nomarlization Data)

  • Scale:
# 導(dǎo)入 min_max scaling
from mlxtend.preprocessing import minmax_scaling

# 縮放數(shù)據(jù)使之處于0到1之間
scaled_data = minmax_scaling(original_data, columns = [0])
  • Nomarlization
# 導(dǎo)入 Box-Cox Transformation
from scipy import stats

# 歸一化數(shù)據(jù)
normalized_data = stats.boxcox(original_data)

鏈接:
https://www.kaggle.com/rtatman/data-cleaning-challenge-scale-and-normalize-data?utm_medium=email&utm_source=mailchimp&utm_campaign=5DDC-data-cleaning

第三天:日期時間的統(tǒng)一化(Parsing Dates)

  • pd.to_datetime
    pandas 中有一個特別的時間類型datetime64, to_datetime就是將object類型轉(zhuǎn)換為datetime64。
landslides['date_parsed'] = pd.to_datetime(landslides['date'], format = "%m/%d/%y")
image
earthquakes['date_parsed'] = pd.to_datetime(earthquakes['Date'],infer_datetime_format=True)

image

萬能的infer_datetime_format=True,pandas自己推斷日期類型,優(yōu)點是可兼容多格式的日期處理,缺點是降低處理速度。

datetime64可以用來干什么?

例:

#獲得每一月同一天的統(tǒng)計數(shù)據(jù)
day_of_month_landslides = landslides['date_parsed'].dt.day
  • 自設(shè)格式的日期數(shù)據(jù)處理
    例如:


    image
for i in range(len(volcanos.index)):
    temp =  volcanos['Last Known Eruption'].values[i]
    if temp == 'Unknown':
        volcanos['Last Known Eruption'].values[i] = None
    elif "CE" in temp:
        volcanos['Last Known Eruption'].values[i] = "-" + temp[0:5]
    else:
         volcanos['Last Known Eruption'].values[i] = temp[0:5]
image
附:關(guān)于%m,%d,%Y的那些事兒 http://strftime.org/

鏈接:
https://www.kaggle.com/rtatman/data-cleaning-challenge-parsing-dates/?utm_medium=email&utm_source=mailchimp&utm_campaign=5DDC-data-cleaning

第四天:字符編碼(Character Encodings)

  • encode(編碼):
#將str編碼為bytes類,但在編碼€時出現(xiàn)了錯誤
before = "This is the euro symbol: €"
after = before.encode("utf-8", errors = "replace")

這里utf-8也可以為ascii、gbk等。

  • decode(解碼):
after.decode("utf-8")

注:
(1)編碼方式要和解碼方式保持一致,否則會出現(xiàn) UnicodeDecodeError
(2)有時候,編碼會導(dǎo)致數(shù)據(jù)丟失

  • 出現(xiàn)其他編碼時:

1)第一步:猜測字符編碼

import chardet
#以二進制方式讀取文件
with open("../input/kickstarter-projects/ks-projects-201801.csv", 'rb') as rawdata:
    result = chardet.detect(rawdata.read(10000))
print(result)
#當(dāng)10k的編碼結(jié)果不正確,可變化read()中的大小,如read(100000)

出現(xiàn)結(jié)果:{'encoding': 'Windows-1252', 'confidence': 0.73, 'language': '}
2)第二步:根據(jù)所得編碼

kickstarter_2016 = pd.read_csv("../input/kickstarter-projects/ks-projects-201612.csv", encoding='Windows-1252')
  • 編碼保存至文件
#默認(rèn)encoding = ‘utf-8’
kickstarter_2016.to_csv("ks-projects-201801-utf8.csv")

鏈接:
https://www.kaggle.com/rtatman/data-cleaning-challenge-character-encodings/?utm_medium=email&utm_source=mailchimp&utm_campaign=5DDC-data-cleaning

第五天:不一致的輸入數(shù)據(jù)(Inconsistent Data Entry)

數(shù)據(jù)觀察:

cities = suicide_attacks['City'].unique()            #選出City字段中不重復(fù)值
cities.sort()                                        #排序
cities
  • 統(tǒng)一大小寫
    例:全部小寫
suicide_attacks['City'] = suicide_attacks['City'].str.lower()
  • 去除字符串兩邊的空格
suicide_attacks['City'] = suicide_attacks['City'].str.strip()
  • 模糊匹配:
    例如:d.i khand. i khan
import fuzzywuzzy
from fuzzywuzzy import process

#與d.i khan相近的前10個字符串
matches = fuzzywuzzy.process.extract("d.i khan", cities, limit=10, scorer=fuzzywuzzy.fuzz.token_sort_ratio)

marches 的結(jié)果是一個包含十個元組的列表:[('d. i khan', 100), ('d.i khan', 100), ('d.g khan', 88)……]。所以需要重新去定義一個函數(shù)來處理它們。

def replace_matches_in_column(df, column, string_to_match, min_ratio = 90):
    # 獲取不重復(fù)的值
    strings = df[column].unique()
    
    # 獲取前10個相近的字符串
    matches = fuzzywuzzy.process.extract(string_to_match, strings, 
                                         limit=10, scorer=fuzzywuzzy.fuzz.token_sort_ratio)

    # 只有當(dāng)相近匹配 > 90
    close_matches = [matches[0] for matches in matches if matches[1] >= min_ratio]

    # 獲取dataframe中所有相近的rows
    rows_with_matches = df[column].isin(close_matches)

    # 替換這些rows 至目標(biāo)值
    df.loc[rows_with_matches, column] = string_to_match
    
    # 提示過程結(jié)束
    print("All done!")

鏈接:
https://www.kaggle.com/rtatman/data-cleaning-challenge-inconsistent-data-entry/?utm_medium=email&utm_source=mailchimp&utm_campaign=5DDC-data-cleaning

致謝:

Rachael Tatman:https://www.kaggle.com/rtatman

也可以從這里學(xué)到SQL、R的知識呦!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 算法:Python中數(shù)據(jù)結(jié)構(gòu)和算法的最小例子https://github.com/keon/algorithms?...
    全宇宙最帥De男人閱讀 559評論 1 1
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,765評論 25 709
  • 雙方想合作,但是卻沒有簽訂某些協(xié)議的情況下要共同合作一件能共同盈利的某個項目的開發(fā),結(jié)果卻出現(xiàn)了各懷鬼胎的壞的...
    徐猛_Merlin閱讀 388評論 0 0

友情鏈接更多精彩內(nèi)容