Python 數據清洗

一.數據清洗與準備

1.缺失值

NaN(np.nan): 對數值型數據,浮點值NaN(not a number)
NA(not available)
None 均爲缺失值,通過data.isnull()檢測,反方法:data.notnull()

過濾(刪除缺失值)

newdata = data.dropna() 等價於 data[data.notnull()]
默認刪除含有缺失值的整行

可選參數:
how=‘all’:當一行全是缺失值才刪除該行,否則不刪除
axis=1:刪除列
thresh=n:保留含有n個觀測值的行

補全

newdata = data.fillna(value) :將缺失值替換爲value
爲不同列的NA設置不同的填充值:傳入字典data.fillna({列名:value,…})

常用可選參數(詳見文檔字符串):
inplace=True:修改原對象而不返回新對象;
method=:插值方法,(比如’ffill’:用前面的值填補後面所有的缺失值),
與limit=n搭配,設置前向或後向填充時最大填充範圍;
axis=1:需要填充的軸

可以用數據的平均值或中位數填充NA:data.fillna(data.mean())

2.數據轉換

去重

df.duplicated(): 是否有重複值,返回同大小的TF結構
newdata = df.drop_duplicates([‘col1’]):基於某些列刪除重複值,默認保留第一條重複行

常用可選參數(詳見文檔字符串):

  1. 列名列表:基於某些列去重
  2. keep=‘last’:保留最後一條重複行
series的逐元素轉換:map

se.map(映射:函數或字典):每個元素傳入到函數或字典中進行轉換
字典就是映射!字典就是映射!字典就是映射!

 # 創建肉類的數據框
data = pd.DataFrame({'food':['bacon','beef','Bacon','nova lox'],'weight':[4,3,12,6]})
print(data)

# 添加一列表示每種食物的動物肉來源
# 創建一個食物與動物肉的映射關係
meat_to_animal = {'bacon':'pig','beef':'cow','nova lox':'salmon'}  # 培根是豬肉...
# 先統一數據的大小寫se.str.lower(),再逐一映射,下面兩條語句等價:
data['animal'] = data['food'].str.lower().map(meat_to_animal)     # 傳入字典進行映射
data['animal'] = data['food'].map(lambda x: meat_to_animal[x.lower()])  # 傳入函數進行映射
data

在這裏插入圖片描述

替換特定值replace

data.replace(old,new) : 將舊值替換爲新值,df全表搜索
可以多對一,多對多,傳入列表,按順序對應,或者傳入字典,例如:data.replace([old1,old2,…],[new1])
data.replace([old1,old2,…],[new1,new2,…])
data.replace({old1:new1,old2:new2,…})

重命名索引
  1. 對索引對象直接賦值:如data.index = range(len(data)),直接修改了原對象
  2. 更全的方法 : data.rename(index=map1,columns=map2,inplace=False)
    映射包括函數與字典。
# 每個行索引值-4,截至時間列修改列名爲date,直接修改原對象
data.rename(index=lambda x:x-4,
			columns={'截至時間(24h)':'date'},
			inplace=True)  

如果傳入的不是映射,是直接的數據,會報錯:xxx object is not callable.不可調用

分組,劃分區間

連續值的離散化,返回Categorical對象,包含了類別標識和標籤
cgc = pd.cut(x=data,bins=分點列表或分組個數)
cgc = pd.qcut(data,bins=分位數列表或分位數個數)

常用可選參數(詳見文檔字符串):
right=True: 區間默認左開右閉,False變爲左閉右開
labels=None: 自定義分組名,傳入列表或者數組
precision=3:小數位數

在這裏插入圖片描述

隨機抽樣

newdata = data.sample(n,replace=True) : 默認無放回隨機抽樣,抽n個
replace=False:有放回

隨機重排序

a = np.random.permutation(n) : 將0~n-1重排序
newdata = df.take(a) or df.iloc(a) # 將順序應用於索引即爲重排序

啞變量

newdata = pd.get_dummies(df[‘col1’]) :將df的一列因子型(字符或Categorical對象)設置爲多個啞變量,變成多列01,因子有n個水平則變爲n列。

可選參數
prefix=‘a’:爲新生成的列名加上前綴’a’以區分

例如:對數據分組後設爲啞變量:pd.get_dummies(pd.cut(data,bins))

3.字符串操作

內建字符串方法
方法 描述
string.split(分隔符) 拆分分隔字符串
.strip() 去除字符串兩端空格及換行符
.rstrip()/.lstrip() 去除字符串右端或左端空白
分隔符.join(字符串列表或元組) 以連接符連接各字符串
.count(子串) 子串出現的次數
.replace(old,new) 將字符串中的old替換爲new,常用於傳入空串來實現刪除效果
.endswith(後綴)/.startwith(前綴) 字符串是否以後綴結尾或前綴開頭
.lower()/.upper() 大小寫轉換
子串 in 字符串 字符串中是否含有某子串
.index(子串)/.find(子串) 字符串中是否含有某子串,返回第一次出現的頭位置,index找不到報錯,find返回-1
string = 'a,b, guido '
l = [x.strip() for x in string.split(',')]  # ['a', 'b', 'guido']
':'.join(l)  # 'a:b:guido'
向量化字符串函數

1.Series.str屬性:就是把每個元素作爲字符串去逐元素應用字符串的方法
se.str.contains(string or regex) :每個元素是否包含string或正則表達式
在這裏插入圖片描述
通過se.str屬性可以調用任意正則表達式的方法應用於每一個元素,se.str就是將se變爲每一個元素都是str,然後逐元素應用正則表達式。

data['food'].str.findall(regex)  # 對每個元素查找匹配項
data['food'].str.get(0)  # 得到每個元素的第一個字符
data['food'].str[:2]  # 對每個元素進行統一切片

所有內建字符串方法都可以通過se.str.內建方法()對每個元素統一應用。具體方法詳見P215。

二.數據合併與重塑

1. 數據庫風格的DataFrame連接

pd.merge(df1,df2,on=,how= ) :不管內外連接,只要多對一,少的都自動重複

可選參數:

  1. on=: 按哪個列連接,兩個df的列名需要一樣,否則指定
    left_on=: (df1),right_on=:(df2)
  2. how=: ‘outer’:外連接,兩個df的鍵的並集,沒有就引入NA,使用dropna後結果就是內連接
        ‘inner’:內連接,鍵的交集
        ‘left’:按照左邊df1的鍵進行連接
        ‘right’:按照右邊df2的鍵進行連接
  3. suffixes:重疊的列名後面加上後綴以示區分
  4. sort=True:默認排序,大數據集上可禁用該功能以獲得更好的性能
  5. indicator:添加一列_merge,指示每一行的來源

按行索引合併,等同於幾個數據框橫向拼接,默認多去少補NA
df1.join(df2,how=‘inner’):
df1.join([df2,df3,…],how=)

2. 軸向拼接

對NumPy數組:
np.concatnate([arr1,arr2],axis=)
對df:
pd.concat([data1,data2],axis=0,join=‘outer’) 按行縱向拼接,默認索引並集

可選參數:
ignore_index:True:忽略索引直接拼,順着產生新索引

3. 重塑和透視

1.有關多重索引
newdata = data.stack() 所有列變成一列因子型,列名是因子,df變成多重索引的se.
data = newdata.unstack() 還原

長數據(冗餘數據)透視爲寬數據(正常數據)

長格式:列少,列有冗餘,主鍵多於一個,共同決定一行
newdata = pivot(‘col1’,‘col2’,‘col3’)

col1:該列的值作爲行索引,成爲唯一主鍵
col2:該列是因子型,因子的水平成爲新列
col3:可選的數字列填充

等價於先用set_index創建分層索引,然後調用unstack
    \iff newdata = data.set_index([‘col1’,‘col2’]).unstack(‘col3’)

寬透視爲長

反操作,將多列合成一列,長度更長,產生冗餘

df = pd.DataFrame({'key':['foo','bar','baz'],
                   'a':[1,2,3],
                   'b':[4,5,6],
                   'c':[7,8,9]})
df

在這裏插入圖片描述

melted = pd.melt(df,id_vars=['key'])  # 必須指明分組指標id_vars,是主鍵的第一部分,是不變的列
melted    # variable是新產生的列,是主鍵的第二部分

在這裏插入圖片描述
還原

data = melted.pivot('key','variable','value')
data

在這裏插入圖片描述
由於key並不是原來的索引,所以將數據回移一列

data.reset_index()

在這裏插入圖片描述

三.數據聚合與分組-groupby-詳見第10章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章