首頁 > 軟體

Pandas資料淨化函數總結

2023-01-14 14:01:01

一、drop():刪除指定行列

drop()函數用於刪除指定行,指定列,同時可以刪除多行多列

語法格式

DataFrame.drop(
        self,
        labels=None,
        axis: Axis = 0,
        index=None,
        columns=None,
        level: Level | None = None,
        inplace: bool = False,
        errors: str = "raise",
    )

引數說明

  • labels:要刪除的行列的名字,接收列表引數,列表內有多個引數時表示刪除多行或者多列
  • axis:要刪除的軸,與labels引數配合使用。預設為0,指刪除行;axis=1,刪除列
  • index:直接指定要刪除的行
  • columns:直接指定要刪除的列
  • inplace:是否直接在原資料上進行刪除操作,預設為False(刪除操作不改變原資料),而是返回一個執行刪除操作後的新dataframe;inplace=True,直接在原資料上修改。

1. 刪除指定行

當 axis=0 時,刪除指定行

import numpy as np
import pandas as pd

df_obj = pd.DataFrame({'data1': ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c'],
                       'data2': [1, 1, 2, 3, 4, 5, 5, 5]},index=list('abcdefgh'))
print(df_obj)
# 刪除第一行
df_obj.drop(labels='a', axis=0, inplace=True)
print(df_obj)

執行結果:

2. 刪除指定列

當 axis=1 時,刪除指定列

import numpy as np
import pandas as pd

df_obj = pd.DataFrame({'data1': ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c'],
                       'data2': [1, 1, 2, 3, 4, 5, 5, 5]}, index=list('abcdefgh'))
print(df_obj)
# 刪除data2 
df_obj.drop(labels='data2', axis=1, inplace=True)
print(df_obj)

執行結果:

二、del():刪除指定列

del()函數與drop()函數相比就沒有那麼靈活了,此操作會對原資料df進行刪除,且一次只能刪除一列。

語法格式

del df[‘列名']

案例:

import numpy as np
import pandas as pd

df_obj = pd.DataFrame({'data1': ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c'],
                       'data2': [1, 1, 2, 3, 4, 5, 5, 5]}, index=list('abcdefgh'))
print(df_obj)
# 刪除data1
del df_obj['data1']
print(df_obj)

執行結果:

三、isnull():判斷是否為缺失

判斷序列元素是否為缺失(返回與序列長度一樣的bool值)

1. 判斷是否為缺失

範例程式碼:

import numpy as np
import pandas as pd

df_obj = pd.DataFrame({'data1': ['a', 'a', 'b', 'b', 'c'],
                       'data2': [1, 2, 3, 4, 5],
                       'data3': np.NaN})
print(df_obj)
print(df_obj.isnull())

執行結果:

2. 判斷哪些列存在缺失

isnull().any()會判斷哪些”列”存在缺失值,資料淨化中經常用的小技巧

print(df_obj.isnull().any())

執行結果:

3. 統計缺失個數

isnull().sum()統計每一列的缺失個數

print(df_obj.isnull().sum())

執行結果:

四、notnull():判斷是否不為缺失

判斷序列元素是否不為缺失(返回與序列長度一樣的bool值),用法與isnull()相似

print(df_obj.notnull())

執行結果:

五、dropna():刪除缺失值

dropna()函數可以刪除缺失值

語法格式:

DataFrame.dropna(
        self,
        axis: Axis = 0,
        how: str = "any",
        thresh=None,
        subset=None,
        inplace: bool = False,
    )

引數說明

  • axis:移除行或列,預設為0,即行含有空值移除行
  • how:‘all’所有值為空移除,'any’預設值,包含空值移除
  • thresh:包含thresh個空值時移除
  • subset:axis軸上,指定需要處理的標籤名稱列表
  • inplace:是否替換原始資料,預設False

1. 匯入資料

import numpy as np
import pandas as pd

df_obj = pd.DataFrame({'data1': ['a', 'a', np.NaN, 'b', 'c'],
                       'data2': [1, 2, np.NaN, 4, 5],
                       'data3': np.NaN,
                       'data4': [1, 2, 3, 4, 5]})
print(df_obj)

執行結果:

2. 刪除含有NaN值的所有行

預設 axis=0

print(df_obj.dropna())

執行結果:

3. 刪除含有NaN值的所有列

設定 axis=1 刪除列

print(df_obj.dropna(axis=1))

執行結果:

4. 刪除元素都是NaN值的行

設定引數 how="all",只有行一整行資料都是NaN的時候才會刪除

print(df_obj.dropna(axis=0,how="all"))

執行結果:由於所有行都有至少有一個有效值,所有都沒刪除

5. 刪除元素都是NaN值的列

print(df_obj.dropna(axis=1,how="all"))

執行結果:

6. 刪除指定列中含有缺失的行

subset引數設定指定列

# 刪除data1列有含有缺失的行
print(df_obj.dropna(subset=["data1"], axis=0))

執行結果:

六. fillna():缺失值填充

缺失值填充

語法格式

fillna(
        self,
        value: object | ArrayLike | None = None,
        method: FillnaOptions | None = None,
        axis: Axis | None = None,
        inplace: bool = False,
        limit=None,
        downcast=None,
    ) -> DataFrame | None

引數說明

  • value:用於填充的空值的值。
  • method: {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, default None。定義了填充空值的方法, pad / ffill表示用前面行/列的值,填充當前行/列的空值, backfill / bfill表示用後面行/列的值,填充當前行/列的空值。
  • axis:選擇軸,預設0(行),axis=1:列
  • inplace:是否替換原始資料
  • limit:int, default None。如果method被指定,對於連續的空值,這段連續區域,最多填充前 limit 個空值(如果存在多段連續區域,每段最多填充前 limit 個空值)。如果method未被指定, 在該axis下,最多填充前 limit 個空值(不論空值連續區間是否間斷)
  • downcast:dict, default is None,字典中的項為,為型別向下轉換規則。或者為字串“infer”,此時會在合適的等價型別之間進行向下轉換,比如float64 to int64 if possible。

1. 匯入資料

import numpy as np
import pandas as pd

df_obj = pd.DataFrame({'data1': ['a', 'a', np.NaN, 'b', 'c'],
                       'data2': [1, 2, np.NaN, 4, 5],
                       'data3': np.NaN,
                       'data4': [1, 2, 3, 4, 5]})
print(df_obj)

執行結果:

2. 預設全部填充

# 用0填補空值
print(df_obj.fillna(value=0))

執行結果:

3. 用前一行的值填補空值

設定引數 method='pad' 用前一行的值填補空值

# 用前一行填充
print(df_obj.fillna(method='pad',axis=0))

執行結果:

4. 用後一列的值填補空值

設定引數 method='backfill'

# 用後一列的值填補空值
print(df_obj.fillna(method='backfill', axis=1))

執行結果:

5. 設定填充個數

limit=數位,設定填充個數

# 用後一列的值填補空值,只填充兩個
print(df_obj.fillna(method='backfill', axis=1, limit=2))

執行結果:

七、ffill():用前一個元素填充

前向後填充缺失值,用缺失值的前一個元素填充,與fillna()相比沒有那麼多可選性

語法格式

ffill(
        self: DataFrame,
        axis: None | Axis = None,
        inplace: bool = False,
        limit: None | int = None,
        downcast=None,
    ) -> DataFrame | None

案例說明:

import numpy as np
import pandas as pd

df_obj = pd.DataFrame({'data1': ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c'],
                       'data2': [1, 1, 2, 3, np.NaN, 5, 5, np.NaN]})
print(df_obj)
print(df_obj.ffill())

執行結果:

八、bfill():用後一個元素填充

後向填充缺失值,用缺失值的後一個元素填充

import numpy as np
import pandas as pd

df_obj = pd.DataFrame({'data1': ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c'],
                       'data2': [1, 1, 2, 3, np.NaN, 5, 5, np.NaN]})
print(df_obj)
print(df_obj.bfill())

九、duplicated():判斷序列元素是否重複

判斷序列元素是否重複

語法格式

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

引數說明

  • subset:列標籤,可選, 預設使用所有列,只考慮某些列來識別重複項傳入列標籤或者列標籤的序列
  • keep:{‘first’,‘last’,False},預設’first’
    • first:刪除第一次出現的重複項。
    • last:刪除重複項,除了最後一次出現。
    • false:刪除所有重複項

返回布林型Series表示每行是否為重複行

範例程式碼:

import numpy as np
import pandas as pd

df_obj = pd.DataFrame({'data1': ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c'],
                       'data2': [1, 1, 2, 3, 4, 5, 5, 5]})
print(df_obj)

print(df_obj.duplicated())

執行結果:

十、drop_duplicates():刪除重複行

刪除重複行,預設判斷全部列,可指定按某些列判斷

語法格式

DataFrame.drop_duplicates(
        self,
        subset: Hashable | Sequence[Hashable] | None = None,
        keep: Literal["first"] | Literal["last"] | Literal[False] = "first",
        inplace: bool = False,
        ignore_index: bool = False,
    ) -> DataFrame | None

引數說明

  • subset:列標籤,可選, 預設使用所有列,只考慮某些列來識別重複項傳入列標籤或者列標籤的序列
  • keep:{‘first’,‘last’,False},預設’first’
    • first:刪除第一次出現的重複項。
    • last:刪除重複項,除了最後一次出現。
    • false:刪除所有重複項
  • inplace:是否替換原資料,預設是False,生成新的物件,可以複製到新的DataFrame
  • ignore_index:bool,預設為False,如果為True,則生成的軸將標記為0,1,…,n-1。

1. 判斷所有列

import numpy as np
import pandas as pd

df_obj = pd.DataFrame({'data1': ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c'],
                       'data2': [1, 1, 2, 3, 4, 5, 5, 5]})
print(df_obj)

print(df_obj.drop_duplicates())

執行結果:

2. 按照指定列進行判斷

print(df_obj.drop_duplicates('data2'))

執行結果:

十一、replace():替換元素

替換元素,可以使用正規表示式

語法格式

replace(
        self,
        to_replace=None,
        value=None,
        inplace: bool = False,
        limit=None,
        regex: bool = False,
        method: str = "pad",
    )

引數說明

  • to_replace: 需要替換的值
  • value:替換後的值
  • inplace: 是否在原資料表上更改,預設 inplace=False
  • limit:向前或向後填充的最大尺寸間隙,用於填充缺失值
  • regex: 是否模糊查詢,用於正規表示式查詢,預設 regex=False
  • method: 填充方式,用於填充缺失值
    • pad: 向前填充
    • ffill: 向前填充
    • bfill: 向後填充

1. 單個值替換

to_replace接收字串

import numpy as np
import pandas as pd

df_obj = pd.DataFrame({'data1': ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c'],
                       'data2': [1, 1, 2, 3, np.NaN, 5, 5, np.NaN]})
print(df_obj)

print(df_obj.replace('a',"A"))

執行結果:

2. 多個值替換一個值

to_replace接收列表

print(df_obj.replace([1, 2], -100))

執行結果:

3. 多個值替換多個值

to_replace接收列表,value接收列表

print(df_obj.replace([1, 2], [-100, -200]))

執行結果:

4. 使用正規表示式:

to_replace接收正則語法,設定 regex=True

import numpy as np
import pandas as pd

df_obj = pd.DataFrame({'data1': ['ab', 'abc', 'aaa', 'b', 'b', 'b', 'c', 'c'],
                       'data2': [1, 1, 2, 3, np.NaN, 5, 5, np.NaN]})
print(df_obj)
# 替換a開頭的
print(df_obj.replace('a.?',"A",regex=True))

執行結果:

十二、str.replace():替換元素

替換元素,可使用正規表示式

import numpy as np
import pandas as pd

s = pd.Series(['foo', 'fuz', np.nan])
print(s)
print(s.str.replace('f.', 'ba', regex=True))

執行結果:

十三、str.split.str():分割元素

以指定字元切割列

import numpy as np
import pandas as pd

data = {'洗漱用品':['毛巾|牙刷|牙膏']}

df = pd.DataFrame(data)
print(df)
print(df['洗漱用品'].str.split('|',expand=True))

執行結果:

 到此這篇關於Pandas資料淨化函數總結的文章就介紹到這了,更多相關pandas資料淨化 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com