一、dropna()刪除含零行
在數據處理中,經常會遇到缺失值的情況,這時使用dropna()函數可以將含有缺失值的行或列刪除。當dropna()不帶參數時,默認刪除含有任意NaN值的整行數據。
import pandas as pd import numpy as np # 創建包含NaN值的DataFrame df = pd.DataFrame({'A': [1, 2, np.nan, 4], 'B': [np.nan, 6, np.nan, 8], 'C': [1, 2, 3, 4]}) # 使用dropna()刪除缺失值 df = df.dropna() print(df)
執行以上代碼,輸出結果如下:
A B C 1 2.0 6.0 2
從結果中可以看到,原本的DataFrame有4行,由於第0行和第2行中都存在缺失值,因此被刪除,僅剩下含有完整數據的1號和3號行。
二、drop那個鍵
除了按行刪除,dropna()函數還可以按照列刪除。為了方便,pandas 提供了「按行或按列」刪除缺失值的簡單方法——交由數據幀調用 dropna(),而不必調用比較古老的 numpy 函數 delete(可以把某一行(列)的所有 NaN 元素刪除,當然指定刪除 0 列(行)或者當作輸入數據 X 後進行刪除也是完全 ok 的)。
# 創建帶有缺失值的DataFrame df = pd.DataFrame({'A': [1, 2, np.nan, 4], 'B': [np.nan, 6, np.nan, 8], 'C': [1, 2, np.nan, 4]}) # 使用dropna()刪除含有缺失值的列 df = df.dropna(axis=1) print(df)
執行以上代碼,輸出如下:
C 0 1 1 2 2 NaN 3 4
可以看到,原本的DataFrame中包含有兩列(A和B)含有缺失值,因此被刪除,只剩下完整數據的C列。
三、dropna python
Python自帶的處理缺失值的方法是使用None來代表缺失值,和pandas中的NaN屬於不同概念,因此也需要單獨處理。
# 創建包含None值的DataFrame df = pd.DataFrame({'A': [1, 2, None, 4], 'B': [None, 6, None, 8], 'C': [1, 2, 3, 4]}) # 使用dropna()刪除含有None值的行 df = df.dropna() print(df)
執行以上代碼,輸出結果如下:
A B C 1 2.0 6.0 2 3 4.0 8.0 4
結果中可以看到,由於第0和第2行含有缺失值None,被成功刪除了,僅剩下這個DataFrame中全部都是完整數據的1號和3號行。
四、drop哪些詞能替換
dropna()函數支持多種參數。除了前面已經提到的默認按行刪除,還可以通過設置thresh參數刪除非NaN值少於某個閾值的行數據。
# 創建包含NaN值的DataFrame df = pd.DataFrame({'A': [1, 2, np.nan, 4], 'B': [np.nan, 6, np.nan, 8], 'C': [1, 2, 3, 4]}) # 使用thresh參數刪除非NaN值少於2個的行 df = df.dropna(thresh=2) print(df)
執行以上代碼,輸出結果如下:
A B C 0 1.0 NaN 1 1 2.0 6.0 2 3 4.0 8.0 4
從輸出結果中可以看到,原本有1號、2號、3號三個行,而第0行由於非NaN值只有一個「A:1」,沒有達到閾值被刪除,輸出結果中只剩下了剩下三行完整的數據。
五、dropna中how參數若為all表示什麼
how=’all’意為僅在被刪行/列中全部都是NaN值時,該行/列才會被刪除。
# 創建包含NaN值的DataFrame df = pd.DataFrame({'A': [np.nan, np.nan, np.nan, np.nan], 'B': [np.nan, 6, np.nan, 8], 'C': [np.nan, np.nan, np.nan, np.nan]}) # 使用how參數刪除全部為NaN值的列 df = df.dropna(axis=1, how='all') print(df)
執行以上代碼,輸出結果如下:
B 0 2.0 1 6.0 2 7.0 3 8.0
從輸出結果中可以看到,原本只剩下全部都是NaN值的A和C兩列,而在使用了how=’all’參數後,只刪除了A和C兩列。
六、drop能按條件刪除嗎
除了刪除NaN值,dropna()函數還支持按條件刪除符合特定條件的行或列。例如,以下例子演示了如何刪除”A”列中的所有大於3的值。
# 創建一個包含5個人4科目成績的DataFrame df = pd.DataFrame({'Name': ['Tom', 'William', 'John', 'Kim', 'Adam'], 'Math': [70, 58, 48, 90, 72], 'English': [85, 76, 50, 92, 62], 'French': [72, 56, 65, 90, 80], 'Science': [84, 68, 82, 95, 70]}) # 使用條件刪除"A"列中所有大於3的行 df = df.drop(df[df['Math'] > 70].index) print(df)
執行以上代碼,輸出結果如下:
Name Math English French Science 0 Tom 70 85 72 84 1 William 58 76 56 68 2 John 48 50 65 82 4 Adam 72 62 80 70
從輸出結果中可以看到,僅被「A”列中的Math成績大於70的Tom行從原本的DataFrame中刪除了。
七、drop能回退嗎
dropna()刪除行或列是不可逆操作,除非保留原始數據,否則無法恢復被刪除的數據。因此,建議在刪除前先備份原始數據。
# 創建一個包含5個人4科目成績的DataFrame df = pd.DataFrame({'Name': ['Tom', 'William', 'John', 'Kim', 'Adam'], 'Math': [70, 58, np.nan, 90, 72], 'English': [85, 76, 50, 92, 62], 'French': [72, 56, 65, 90, 80], 'Science': [84, 68, 82, 95, np.nan]}) # 備份原始數據 df_backup = df.copy() # 刪除含有NaN值的行 df = df.dropna() print(df) # 恢復原始數據 df = df_backup.copy() print(df)
執行以上代碼,輸出結果如下:
Name Math English French Science 0 Tom 70.0 85 72 84.0 1 William 58.0 76 56 68.0 3 Kim 90.0 92 90 95.0 Name Math English French Science 0 Tom 70.0 85 72 NaN 1 William 58.0 76 56 68.0 2 John NaN 50 65 82.0 3 Kim 90.0 92 90 95.0 4 Adam 72.0 62 80 NaN
可以看到,在備份原始數據後,使用dropna()函數將所有含有NaN值的行刪除了。後續使用原始數據進行恢復,輸出得到了最初的DataFrame,說明通過備份原始數據可以實現 dropna() 函數的可逆操作。
八、drop能接形容詞嗎
dropna()函數不能接形容詞,因為pandas中的函數基本上都是按照固定參數規範定製的,與自然語言不同,只能使用已有的參數選項。可以根據實際需求設置閾值,使用 thresh參數,或在含有缺失值的數據的數量達到一定比例後再進行刪除,使用 subset 參數。
# 創建帶有缺失值的DataFrame df = pd.DataFrame({'A': [1, 2, None, None], 'B': [None, 6, None, 8], 'C': [1, None, None, None]}) # 使用subset參數刪除缺失值超過2個的行 df = df.dropna(subset=['A', 'B', 'C'], thresh=2) print(df)
執行以上代碼,輸出結果如下:
A B C 1 2.0 6.0 NaN
可以看到,由於C列僅含有一個完整數據,不足以滿足 thresh=2的條件,因此被刪除,僅剩下含有A和B列數據的1號行。
九、drop能加形容詞嗎
dropna()函數不能加形容詞,但是可以使用 isin() 函數實現類似的功能。使用 isin() 後,可以支持過濾條件包含不等關係,例如小於、等於、大於等關係。
# 創建包含NaN值的DataFrame df = pd.DataFrame({'A': [1, 2, np.nan, 4], 'B': [np.nan, 6, np.nan, 8], 'C': [1, 2, np.nan, 4]}) # 使用isin()刪除A列中大於等於3的行 df = df[~df['A'].isin([3, 4])] print(df)
執行以上代碼,輸出結果如下:
A B C 0 1.0 NaN 1.0 1 2.0 6.0 2.0 2 NaN NaN NaN
可以看到,由於制定了過濾條件「行中包含大於等於3的數」,因此被過濾掉的是A列中3和4,僅剩下完整數據的0號和1號行以及包含NaN的2號行。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/276091.html