<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
pandas對巨量資料有很多便捷的清洗用法,尤其針對缺失值和重複值。缺失值就不用說了,會影響計算,重複值有時候可能並未帶來新的資訊反而增加了計算量,所以有時候要進行處理。針對一些文字資料可能不合要求的還要進行替換什麼的。
首先匯入包:
import numpy as np import pandas as pd
'''一般使用特殊型別 NaN 代表缺失值,可以用 Numpy 可定義它np.NaN/np.nan。在 Pandas 1.0 以後實驗性地使用一個標量 pd.NA 來代表。
如果想把正負無窮也為認是缺失值,可以通過以下全域性設定來設定:'''
pandas.options.mode.use_inf_as_na = True #以下資料 NaN 為缺失值: df=(pd.DataFrame(np.random.randn(5, 3),index=['a', 'c', 'e', 'f', 'h'], columns=['one', 'two', 'three']) .reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])) df
#可以判斷是否缺失值,DataFrame 和 Series 一般都支援。:
# 不是缺失值 df.one.notna()
df.isna() # 是缺失值
df[df.one.notna()]# 進行篩選
#需要注意的是,Numpy 中 np.nan 和 np.nan 不相等,因此不能用 ==/!= 進行對比: None == None # noqa: E711 # True np.nan == np.nan # False None == np.nan # False
其他方法:
df.notna() df['team'].isna() df['team'].isnull()
df.isnull().sum()#計算每列缺失值個數 df.isnull().sum(1)#計算每行缺失值個數 df.isnull().sum().sum()#總共缺失值個數
df.loc[df.isna().any(1)]# 有缺失值的行 df.loc[:,df.isna().any()] # 有缺失值的列 df.loc[~(df.isna().any(1))] # 沒有缺失值的行 df.loc[:,~(df.isna().any())] # 沒有缺失值的列
#時間中的缺失值 #對於時間中的缺失值,Pandas 提供了一個 NaT 來表示,並且 NaT 和 NaN 之間是相容的: df['timestamp'] = pd.Timestamp('20120101') df.loc[['a', 'c', 'h'], ['one', 'timestamp']] = np.nan df.timestamp
#整型中的缺失值,由於 NaN 是浮點型,因此一列甚至缺少一個整數的整數列都將轉換為浮點。
pd.Series([1, 2, np.nan, 4], dtype=pd.Int64Dtype())
#可以使用 None 等方法將內容修改為缺失值: s.loc[0] = None s.loc[1] = np.nan df.two = pd.NA
首先生成案例資料:
df = pd.DataFrame([[np.nan, 2, np.nan, 0], [3, 4, np.nan, 1], [np.nan, np.nan, np.nan, 5], [np.nan, 3, np.nan, 4]], columns=list('ABCD')) df
fillna(x) 可以將缺失值填充指定的值。以下為幾種常見的填充方法:
df.fillna(0)# 填充為 0 # 填充為指定字元 df.fillna('missing') df.fillna('暫無') df.fillna('待補充') df.one.fillna('暫無') # 指定欄位填充 df.one.fillna(0, inplace=Ture) # 使填充內容生效 df.fillna(0, limit=1) # 只替換第一個 values = {'A': 0, 'B': 1, 'C': 2, 'D': 3} # 不同列替換不同的值 df.fillna(value=values)
不指定值,使用一定的方法。
#使用 method{‘backfill', ‘bfill', ‘pad', ‘ffill', None}, default None df.fillna(method='backfill')# 使用上一個有效值填充 df.fillna(method='bfill')# 同 backfill df.fillna(method='pad')# 把當前值廣播到後邊的缺失值 df.fillna(method='ffill')# 同 pad #fillna(method='ffill') 可以簡寫為 ffill() , fillna(method='bfill') 可以簡寫為 bfill()
使用計算值填充:
# 填充列的平均值 df.fillna(df.mean()) # 對指定列填充平均值 df.fillna(df.mean()['B':'C']) # 填充列的平均值,另外一個方法 df.where(pd.notna(df), df.mean(), axis='columns') #特別的計算: # 第一個非空值 df.fillna(method='bfill').head(1).iloc[0] # 第一個非空值索引 df.notna().idxmax() df.apply(pd.Series.first_valid_index)
插值方式,以下是一個非常簡單的範例,其中一個值是缺失的,我們對它進行差值:
s = pd.Series([0, 1,4,9, np.nan, 25]) s.interpolate()
9和25之間的中間點為17,就把缺失值補為了17,這是線性插值。
s.interpolate(method='spline',order=2)
這是二級多項式插值。用X^2這個函數去插值的,
'''預設linear 方法,會認為是一條直線。
計算方法:
預設 method=‘linear’ 如果你的資料增長速率越來越快,可以選擇 method='quadratic' 二次插值。如果資料集呈現出累計分佈的樣子,
推薦選擇 method='pchip'。如果需要填補預設值,以平滑繪圖為目標,推薦選擇 method='akima'。method='akima' 和 method = ‘pchip’,
需要你的環境中安裝了 Scipy 庫。除此之外,method='barycentric' 和 method='pchip' 同樣也需要 Scipy 才能使用。
使用插值方法,可為:
其他引數:
生成案例資料:
#一般刪除會針對行進行,如一行中有缺失值就會刪除,當然也會有針對列的。 df = pd.DataFrame({"name": ['Alfred', 'Batman', 'Catwoman'], "toy": [np.nan, 'Batmobile', 'Bullwhip'], "born": [pd.NaT, pd.Timestamp("1940-04-25"), pd.NaT]}) df
# 刪除所有有缺失值的行(有一個缺失就刪除) df.dropna() # 刪除所有有缺失值的列 df.dropna(axis='columns') df.dropna(axis=1) # 刪除所有值都缺失的行 df.dropna(how='all') # 不足2個非空值時刪除 df.dropna(thresh=2) # 指定判斷缺失值的列範圍 df.dropna(subset=['name', 'born']) # 使刪除和的結果生效 df.dropna(inplace=True) # 指定列的缺失值刪除 df.toy.dropna()
重複值的尋找主要使用duplicated,語法為:
df.duplicated(subset=None, keep='first')
'''可以返回表示重複行的布林系列,可以指定列。keep引數確定要標記的重複項(如果有),選項有:
生成案例資料:
df = pd.DataFrame({'brand': ['Yum Yum', 'Yum Yum', 'Indomie', 'Indomie', 'Indomie'], 'style': ['cup', 'cup', 'cup', 'pack', 'pack'], 'rating': [4, 4, 3.5, 15, 5] }) df
#預設情況下,對於每組重複的值,第一次出現都設定為False,所有其他值設定為True。
df.duplicated()
通過使用“ last”,將每組重複值的最後一次出現設定為False,將所有其他重複值設定為True。
df.duplicated(keep='last')
#通過將keep設定為False,所有重複項都為True。
df.duplicated(keep='last')
要在特定列上查詢重複項,請使用子集。
df.duplicated(keep=False)
'''刪除重複值的語法為:
df.drop_duplicates(subset=None, keep='first', inplace=False, ignore_index=False)
subset指定的標籤或標籤序列可選,僅刪除某些列重複項,預設情況為使用所有列,其他有:
df.drop_duplicates()
#預設情況下,它將基於所有列刪除重複的行。
df.drop_duplicates(subset=['brand'])
#要刪除特定列上的重複項,使用子集
df.drop_duplicates(subset=['brand', 'style'], keep='last')
#刪除重複項並保留最後一次出現,請使用keep。
語法
df.drop(labels=None,axis=0,index=None,columns=None,level=None,inplace=False,errors='raise')
labels表示要刪除的行或者列,多個可以傳入列表:
df.drop([2,4])#刪除指定行
df.drop(['brand','rating'],axis=1)#刪除指定列 df.drop(columns=['brand','rating'])#同上
有時候想把資料替換為指定的值,空值缺失值都可以替換
#指定值替換,以下是在 Series 中將 0 替換為 5: ser = pd.Series([0., 1., 2., 3., 4.]) ser.replace(0, 5) #也可以批次替換: # 一一對應進行替換 ser.replace([0, 1, 2, 3, 4], [4, 3, 2, 1, 0]) # 用字典對映對應替換值 ser.replace({0: 10, 1: 100}) # 將 a 列的 0 b 列中的 5 替換為 100 df.replace({'a': 0, 'b': 5}, 100) # 指定列裡的替換規劃 df.replace({'a': {0: 100, 4: 400}})
除了給定指定值進行替換,我們還可以指定一些替換的方法:
# 將 1,2,3 替換為它們前一個值(0) ser.replace([1, 2, 3], method='pad') # ffill 是它同義詞 # 將 1,2,3 替換為它們後一個值(4) ser.replace([1, 2, 3], method='bfill')
#如果遇到字元比較複雜的內容,就是使用正則(預設沒有開啟)進行匹配: # 把 bat 替換為 new df.replace(to_replace='bat', value='new') # 利用正則將 ba 開頭的替換為 new df.replace(to_replace=r'^ba.$', value='new', regex=True) # 如果多列規則不一的情況下可以按以下格式對應傳入 df.replace({'A': r'^ba.$'}, {'A': 'new'}, regex=True) # 多個規則替換為同一個值 df.replace(regex=[r'^ba.$', 'foo'], value='new') # 直接多個正則及對應的替換內容 df.replace(regex={r'^ba.$': 'new', 'foo': 'xyz'})
替換可以處理缺失值相關的問題,如我們可以將無效的值先替換為 nan,再做缺失值處理:
生成案例資料‘
d = {'a': list(range(4)), 'b': list('ab..'), 'c': ['a', 'b', np.nan, 'd']} df = pd.DataFrame(d) df
一些用法:
# 將.替換為 nan,(也可以替換為 None) df.replace('.', np.nan) # 使用正則,將空格和點等替換為 nan df.replace(r's*.s*', np.nan, regex=True) # 對應替換,a 換 b, 點換 nan df.replace(['a', '.'], ['b', np.nan]) # 點換 dot, a 換 astuff (第一位+) df.replace([r'.', r'(a)'], ['dot', r'1stuff'], regex=True) # b 中的點要替換,替換為 b 替換規則為 nan,可以多列 df.replace({'b': '.'}, {'b': np.nan}) # 使用正則 df.replace({'b': r's*.s*'}, {'b': np.nan}, regex=True) # b列的 b 值換為空 df.replace({'b': {'b': r''}}, regex=True) # b 列的點空格等換 nan df.replace(regex={'b': {r's*.s*': np.nan}}) # b列點等+ty df.replace({'b': r's*(.)s*'}, {'b': r'1ty'},regex=True) # 多個正則規則(a,b,. 都換為缺失) df.replace([r's*.s*', r'a|b'], np.nan, regex=True) # 用引數名傳參 df.replace(regex=[r's*.s*', r'a|b'], value=np.nan)
生成資料:
df = pd.DataFrame(np.random.randn(5, 2)) df[np.random.rand(df.shape[0]) > 0.5] = 1.5 df
# 將 1.5 替換為 nan df.replace(1.5, np.nan) # 將1.5換為 nan, 同時於左上角的值換為 a df.replace([1.5, df.iloc[0, 0]], [np.nan, 'a']) # 使替換生效 df.replace(1.5, np.nan, inplace=True)
#對一些極端值,如過大或者過小,可以使用 df.clip(lower, upper) 來修剪,當資料大於 upper 時,使用 upper 的值,
#小於 lower 時用 lower 的值,就像 numpy.clip 方法一樣。
df = pd.DataFrame({'a': [-1, 2, 5], 'b': [6, 1, -3]}) df
修剪成最大為3最小為0
df.clip(0,3)
用來處理資料裡面的異常值什麼的還是很方便的。
到此這篇關於pandas資料淨化(缺失值和重複值的處理)的文章就介紹到這了,更多相關pandas資料淨化內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45