溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

發(fā)布時(shí)間:2022-08-13 14:29:55 來源:億速云 閱讀:204 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。

前言

pandas對大數(shù)據(jù)有很多便捷的清洗用法,尤其針對缺失值和重復(fù)值。缺失值就不用說了,會(huì)影響計(jì)算,重復(fù)值有時(shí)候可能并未帶來新的信息反而增加了計(jì)算量,所以有時(shí)候要進(jìn)行處理。針對一些文本數(shù)據(jù)可能不合要求的還要進(jìn)行替換什么的。

首先導(dǎo)入包:

import numpy as np 
import pandas as pd

缺失值處理

'''一般使用特殊類型 NaN 代表缺失值,可以用 Numpy 可定義它np.NaN/np.nan。在 Pandas 1.0 以后實(shí)驗(yàn)性地使用一個(gè)標(biāo)量 pd.NA 來代表。
如果想把正負(fù)無窮也為認(rèn)是缺失值,可以通過以下全局配置來設(shè)定:'''

pandas.options.mode.use_inf_as_na = True
#以下數(shù)據(jù) 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

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

缺失值的判斷

#可以判斷是否缺失值,DataFrame 和 Series 一般都支持。:

# 不是缺失值
df.one.notna()

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

df.isna()  # 是缺失值

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

df[df.one.notna()]# 進(jìn)行篩選

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

#需要注意的是,Numpy 中 np.nan 和 np.nan 不相等,因此不能用 ==/!= 進(jìn)行對比:
None == None       # noqa: E711  # True
np.nan == np.nan   # False 
None == np.nan     # False

其他方法:

df.notna()
df['team'].isna()
df['team'].isnull()

缺失值統(tǒng)計(jì)

df.isnull().sum()#計(jì)算每列缺失值個(gè)數(shù)
df.isnull().sum(1)#計(jì)算每行缺失值個(gè)數(shù)
df.isnull().sum().sum()#總共缺失值個(gè)數(shù)

缺失值篩選

df.loc[df.isna().any(1)]#   有缺失值的行
df.loc[:,df.isna().any()] # 有缺失值的列
df.loc[~(df.isna().any(1))]  # 沒有缺失值的行
df.loc[:,~(df.isna().any())] # 沒有缺失值的列

缺失值類型

#時(shí)間中的缺失值
#對于時(shí)間中的缺失值,Pandas 提供了一個(gè) NaT 來表示,并且 NaT 和 NaN 之間是兼容的:
df['timestamp'] = pd.Timestamp('20120101')
df.loc[['a', 'c', 'h'], ['one', 'timestamp']] = np.nan
df.timestamp

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

 #整型中的缺失值,由于 NaN 是浮點(diǎn)型,因此一列甚至缺少一個(gè)整數(shù)的整數(shù)列都將轉(zhuǎn)換為浮點(diǎn)。

pd.Series([1, 2, np.nan, 4], dtype=pd.Int64Dtype())

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

 插入缺失值

 #可以使用 None 等方法將內(nèi)容修改為缺失值:
s.loc[0] = None
s.loc[1] = np.nan
df.two = pd.NA

缺失值填充

首先生成案例數(shù)據(jù):

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

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

fillna(x) 可以將缺失值填充指定的值。以下為幾種常見的填充方法:

df.fillna(0)# 填充為 0
# 填充為指定字符
df.fillna('missing')
df.fillna('暫無')
df.fillna('待補(bǔ)充')
 
df.one.fillna('暫無')   # 指定字段填充
df.one.fillna(0, inplace=Ture)    # 使填充內(nèi)容生效
df.fillna(0, limit=1)   # 只替換第一個(gè)
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')# 使用上一個(gè)有效值填充
df.fillna(method='bfill')# 同 backfill
df.fillna(method='pad')# 把當(dāng)前值廣播到后邊的缺失值
df.fillna(method='ffill')# 同 pad
#fillna(method='ffill') 可以簡寫為 ffill() , fillna(method='bfill') 可以簡寫為 bfill()

使用計(jì)算值填充:

# 填充列的平均值
df.fillna(df.mean())
# 對指定列填充平均值
df.fillna(df.mean()['B':'C'])
# 填充列的平均值,另外一個(gè)方法
df.where(pd.notna(df), df.mean(), axis='columns')
 
#特別的計(jì)算:
# 第一個(gè)非空值
df.fillna(method='bfill').head(1).iloc[0]
# 第一個(gè)非空值索引
df.notna().idxmax()
df.apply(pd.Series.first_valid_index)

插值填充

插值方式,以下是一個(gè)非常簡單的示例,其中一個(gè)值是缺失的,我們對它進(jìn)行差值:

s = pd.Series([0, 1,4,9, np.nan, 25])
s.interpolate()

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

 9和25之間的中間點(diǎn)為17,就把缺失值補(bǔ)為了17,這是線性插值。

s.interpolate(method='spline',order=2)

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

這是二級(jí)多項(xiàng)式插值。用X^2這個(gè)函數(shù)去插值的,

interpolate() 的具體參數(shù)

'''默認(rèn)linear 方法,會(huì)認(rèn)為是一條直線。

計(jì)算方法:

默認(rèn) method=‘linear’ 如果你的數(shù)據(jù)增長速率越來越快,可以選擇 method='quadratic' 二次插值。如果數(shù)據(jù)集呈現(xiàn)出累計(jì)分布的樣子,
推薦選擇 method='pchip'。如果需要填補(bǔ)缺省值,以平滑繪圖為目標(biāo),推薦選擇 method='akima'。method='akima' 和 method = ‘pchip’,
需要你的環(huán)境中安裝了 Scipy 庫。除此之外,method='barycentric' 和 method='pchip' 同樣也需要 Scipy 才能使用。

使用插值方法,可為:

  • linear:線性,忽略索引,并將值等距地對待,這是MultiIndexes支持的唯一方法

  • time:時(shí)間,以插值給定的時(shí)間間隔長度處理每日或更高粒度的數(shù)據(jù)

  • index, values:索引,值,使用索引的實(shí)際數(shù)值

  • pad:使用現(xiàn)有值填寫NaN。

  • ‘nearest’, ‘zero’, ‘slinear’, ‘quadratic’, ‘cubic’, ‘spline’, ‘barycentric’, ‘polynomial’:

  • 傳遞給 scipy.interpolate.interp1d,這些方法使用索引的數(shù)值。 ‘polynomial’ 和 ‘spline’ 都要求您還指定一個(gè)順序(int),

  • 例如 df.interpolate(method='polynomial',order=5)

    • nearest:最近

    • zero:

    • slinear:線性

    • quadratic:二次方

    • cubic:立方

    • spline:花鍵,樣條插值

    • barycentric:重心插值

    • polynomial:多項(xiàng)式

    • ‘krogh’, ‘piecewise_polynomial’, ‘spline’, ‘pchip’, ‘akima’: SciPy 類似名稱的插值方法。

    • krogh: 克羅格插值

    • piecewise_polynomial: 分段多項(xiàng)式

    • spline: 樣條插值

    • pchip: 立方插值   (累計(jì)分布)

    • akima: 阿克瑪插值  (平滑繪圖)

  • from_derivatives:指 scipy.interpolate.BPoly.from_derivatives,它替換了 scipy 0.18 中的 piecewise_polynomial 插值方法。

其他參數(shù):

  • axis: 插值應(yīng)用的軸方向,可選擇 {0 or ‘index’, 1 or ‘columns’, None}, 默認(rèn)為 None

  • limitint: 要填充的連續(xù) NaN 的最大數(shù)量, 必須大于 0。

  • inplace: 是否將最終結(jié)果替換原數(shù)據(jù),默認(rèn)為 False

  • limit_direction: 限制方向,可傳入 {‘forward’, ‘backward’, ‘both’}, 默認(rèn) ‘forward’,如果指定了限制,則將沿該方向填充連續(xù)的 NaN

  • limit_area: 限制區(qū)域,可傳入 {None, ‘inside’, ‘outside’}, 默認(rèn) None,如果指定了限制,則連續(xù)的NaN將被此限制填充

  •  None: 沒有填充限制

  • ‘inside’: 僅填充有效值包圍的NaN(內(nèi)插)

  •  ‘outside’: 僅將NaN填充到有效值之外(外推)

  • downcast: 可傳入‘infer’ 或者 None, 默認(rèn)是 None,如果可以向下轉(zhuǎn)換 dtypes

  • **kwargs: 傳遞給插值函數(shù)的關(guān)鍵字參數(shù) '''

 缺失值刪除 

生成案例數(shù)據(jù):

#一般刪除會(huì)針對行進(jìn)行,如一行中有缺失值就會(huì)刪除,當(dāng)然也會(huì)有針對列的。
df = pd.DataFrame({"name": ['Alfred', 'Batman', 'Catwoman'],
                   "toy": [np.nan, 'Batmobile', 'Bullwhip'],
                   "born": [pd.NaT, pd.Timestamp("1940-04-25"),
                            pd.NaT]})
df

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

缺失值刪除 dropna

# 刪除所有有缺失值的行(有一個(gè)缺失就刪除)
df.dropna()
# 刪除所有有缺失值的列
df.dropna(axis='columns')
df.dropna(axis=1)
# 刪除所有值都缺失的行
df.dropna(how='all')
# 不足2個(gè)非空值時(shí)刪除
df.dropna(thresh=2)
# 指定判斷缺失值的列范圍
df.dropna(subset=['name', 'born'])
# 使刪除和的結(jié)果生效
df.dropna(inplace=True)
# 指定列的缺失值刪除
df.toy.dropna()

重復(fù)值處理

重復(fù)值的尋找主要使用duplicated,語法為:

df.duplicated(subset=None, keep='first')

'''可以返回表示重復(fù)行的布爾系列,可以指定列。keep參數(shù)確定要標(biāo)記的重復(fù)項(xiàng)(如果有),選項(xiàng)有:

  • first:將除第一次出現(xiàn)的重復(fù)值標(biāo)記為True,默認(rèn)。

  • last:將除最后一次出現(xiàn)的重復(fù)值標(biāo)記為True。

  • False:將所有重復(fù)值標(biāo)記為True。'''

生成案例數(shù)據(jù):

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

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

重復(fù)值查找

#默認(rèn)情況下,對于每組重復(fù)的值,第一次出現(xiàn)都設(shè)置為False,所有其他值設(shè)置為True。

df.duplicated()

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

通過使用“ last”,將每組重復(fù)值的最后一次出現(xiàn)設(shè)置為False,將所有其他重復(fù)值設(shè)置為True。

df.duplicated(keep='last')

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

 #通過將keep設(shè)置為False,所有重復(fù)項(xiàng)都為True。

df.duplicated(keep='last')

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

要在特定列上查找重復(fù)項(xiàng),請使用子集。

df.duplicated(keep=False)

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

刪除重復(fù)值

'''刪除重復(fù)值的語法為:

df.drop_duplicates(subset=None,
                   keep='first',
                   inplace=False,
                   ignore_index=False)

subset指定的標(biāo)簽或標(biāo)簽序列可選,僅刪除某些列重復(fù)項(xiàng),默認(rèn)情況為使用所有列,其他有:

  • keep:確定要保留的重復(fù)項(xiàng)(如果有)

  • first : 保留第一次出現(xiàn)的重復(fù)項(xiàng),默認(rèn)

  • last : 保留最后一次出現(xiàn)的重復(fù)項(xiàng)。

  • False : 刪除所有重復(fù)項(xiàng)

  • inplac:False,是將副本放置在適當(dāng)位置還是返回副本

  • ignore_inde:如果為True, 則重新分配自然索引(0, 1, …, n - 1)'''

df.drop_duplicates()

#默認(rèn)情況下,它將基于所有列刪除重復(fù)的行。 

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

df.drop_duplicates(subset=['brand'])

#要?jiǎng)h除特定列上的重復(fù)項(xiàng),使用子集

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

df.drop_duplicates(subset=['brand', 'style'], keep='last')

#刪除重復(fù)項(xiàng)并保留最后一次出現(xiàn),請使用keep。

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

drop刪除數(shù)據(jù)

語法

df.drop(labels=None,axis=0,index=None,columns=None,level=None,inplace=False,errors='raise')

labels表示要?jiǎng)h除的行或者列,多個(gè)可以傳入列表:

  • axis:表示軸方向,默認(rèn)0(行)

  • index:指定一行或多行

  • columns:指定列

  • level:指定多層索引

  • inplace:立即修改  

df.drop([2,4])#刪除指定行

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

df.drop(['brand','rating'],axis=1)#刪除指定列
df.drop(columns=['brand','rating'])#同上

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

數(shù)據(jù)替換replace

有時(shí)候想把數(shù)據(jù)替換為指定的值,空值缺失值都可以替換

#指定值替換,以下是在 Series 中將 0 替換為 5:
ser = pd.Series([0., 1., 2., 3., 4.])
ser.replace(0, 5)
 
#也可以批量替換:
# 一一對應(yīng)進(jìn)行替換
ser.replace([0, 1, 2, 3, 4], [4, 3, 2, 1, 0])
# 用字典映射對應(yīng)替換值
ser.replace({0: 10, 1: 100})
# 將 a 列的 0 b 列中的 5 替換為 100
df.replace({'a': 0, 'b': 5}, 100)
#  指定列里的替換規(guī)劃
df.replace({'a': {0: 100, 4: 400}})

 除了給定指定值進(jìn)行替換,我們還可以指定一些替換的方法:

# 將 1,2,3 替換為它們前一個(gè)值(0)
ser.replace([1, 2, 3], method='pad') # ffill 是它同義詞
# 將 1,2,3 替換為它們后一個(gè)值(4)
ser.replace([1, 2, 3], method='bfill')

字符替換

#如果遇到字符比較復(fù)雜的內(nèi)容,就是使用正則(默認(rèn)沒有開啟)進(jìn)行匹配:
 
# 把 bat 替換為 new
df.replace(to_replace='bat', value='new')
# 利用正則將 ba 開頭的替換為 new
df.replace(to_replace=r'^ba.$', value='new', regex=True)
# 如果多列規(guī)則不一的情況下可以按以下格式對應(yīng)傳入
df.replace({'A': r'^ba.$'}, {'A': 'new'}, regex=True)
# 多個(gè)規(guī)則替換為同一個(gè)值
df.replace(regex=[r'^ba.$', 'foo'], value='new')
# 直接多個(gè)正則及對應(yīng)的替換內(nèi)容
df.replace(regex={r'^ba.$': 'new', 'foo': 'xyz'})

缺失值替換

替換可以處理缺失值相關(guān)的問題,如我們可以將無效的值先替換為 nan,再做缺失值處理:
生成案例數(shù)據(jù)‘

d = {'a': list(range(4)),
     'b': list('ab..'),
     'c': ['a', 'b', np.nan, 'd']}
df = pd.DataFrame(d)
df

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

 一些用法:

# 將.替換為 nan,(也可以替換為 None)
df.replace('.', np.nan)
# 使用正則,將空格和點(diǎn)等替換為 nan
df.replace(r'\s*\.\s*', np.nan, regex=True)
# 對應(yīng)替換,a 換 b, 點(diǎn)換 nan
df.replace(['a', '.'], ['b', np.nan])
# 點(diǎn)換 dot, a 換 astuff  (第一位+)
df.replace([r'\.', r'(a)'], ['dot', r'\1stuff'], regex=True)
 
# b 中的點(diǎn)要替換,替換為 b 替換規(guī)則為 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 列的點(diǎn)空格等換 nan
df.replace(regex={'b': {r'\s*\.\s*': np.nan}})
# b列點(diǎn)等+ty
df.replace({'b': r'\s*(\.)\s*'},
           {'b': r'\1ty'},regex=True)
# 多個(gè)正則規(guī)則(a,b,. 都換為缺失)
df.replace([r'\s*\.\s*', r'a|b'], np.nan, regex=True)
# 用參數(shù)名傳參
df.replace(regex=[r'\s*\.\s*', r'a|b'], value=np.nan)

數(shù)字替換

生成數(shù)據(jù):

df = pd.DataFrame(np.random.randn(5, 2))
df[np.random.rand(df.shape[0]) > 0.5] = 1.5
df

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

# 將 1.5 替換為 nan
df.replace(1.5, np.nan)
# 將1.5換為 nan, 同時(shí)于左上角的值換為 a
df.replace([1.5, df.iloc[0, 0]], [np.nan, 'a'])
# 使替換生效
df.replace(1.5, np.nan, inplace=True)

數(shù)據(jù)裁剪df.clip()

#對一些極端值,如過大或者過小,可以使用 df.clip(lower, upper) 來修剪,當(dāng)數(shù)據(jù)大于 upper 時(shí),使用 upper 的值,
#小于 lower 時(shí)用 lower 的值,就像 numpy.clip 方法一樣。

df = pd.DataFrame({'a': [-1, 2, 5], 'b': [6, 1, -3]})
df

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

修剪成最大為3最小為0

df.clip(0,3)

pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值

用來處理數(shù)據(jù)里面的異常值什么的還是很方便的。

讀到這里,這篇“pandas怎么處理數(shù)據(jù)中的缺失值和重復(fù)值”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI