[英]Dropping rows with pandas data frame when multiple Null values exist
我正在嘗試通過數據框中的每一行 go 並檢查所選行是否有超過 3 個 null 值(這部分有效),然后刪除整行。 但是,在嘗試從數據框中刪除所述行時,我遇到了一個錯誤:
AttributeError: 'NoneType' object 沒有屬性 'index'
如果這段代碼效率低下,請原諒我,我只需要它工作。
import pandas as pd
df = pd.read_csv('data/mycsv.csv')
i = 0
while i < len(df.index):
if df.iloc[i].isnull().sum() > 3:
df = df.drop(df.index[i], inplace = True)
i += 1
使用DataFrame.dropna
與thresh
,但因為它是非 NaN 列需要減去列的長度:
np.random.seed(2021)
df = pd.DataFrame(np.random.choice([np.nan, 1], size=(5,6)))
print (df)
0 1 2 3 4 5
0 NaN 1.0 1.0 NaN 1.0 NaN
1 NaN NaN 1.0 NaN 1.0 1.0
2 1.0 1.0 NaN NaN NaN NaN
3 NaN NaN 1.0 1.0 1.0 1.0
4 NaN 1.0 NaN 1.0 NaN NaN
N = 3
df1 = df.dropna(thresh=len(df.columns) - N)
print(df1)
0 1 2 3 4 5
0 NaN 1.0 1.0 NaN 1.0 NaN
1 NaN NaN 1.0 NaN 1.0 1.0
3 NaN NaN 1.0 1.0 1.0 1.0
N = 2
df2 = df.dropna(thresh=len(df.columns) - N)
print(df2)
0 1 2 3 4 5
3 NaN NaN 1.0 1.0 1.0 1.0
您可以過濾行,如果等於或小於boolean indexing
中的3 NaN
:
N = 3
df1 = df[df.isnull().sum(axis=1) <= N]
print (df1)
0 1 2 3 4 5
0 NaN 1.0 1.0 NaN 1.0 NaN
1 NaN NaN 1.0 NaN 1.0 1.0
3 NaN NaN 1.0 1.0 1.0 1.0
使用threshold=X
作為dropna
的參數,其中 X 是列數 ( df.shape[1]
) 減去閾值 ( 3
)。
假設這個 dataframe
>>> df
0 1 2 3 4 5
0 NaN NaN NaN NaN NaN NaN # Drop (Nan = 6)
1 NaN NaN NaN NaN NaN 1.0 # Drop (Nan = 5)
2 NaN NaN NaN NaN 1.0 1.0 # Drop (Nan = 4)
3 NaN NaN NaN 1.0 1.0 1.0 # Keep (Nan = 3)
4 NaN NaN 1.0 1.0 1.0 1.0 # Keep (Nan = 2)
5 NaN 1.0 1.0 1.0 1.0 1.0 # Keep (Nan = 1)
6 1.0 1.0 1.0 1.0 1.0 1.0 # Keep (Nan = 0)
df = df.dropna(thresh=df.shape[1] - 3)
print(df)
0 1 2 3 4 5
3 NaN NaN NaN 1.0 1.0 1.0
4 NaN NaN 1.0 1.0 1.0 1.0
5 NaN 1.0 1.0 1.0 1.0 1.0
6 1.0 1.0 1.0 1.0 1.0 1.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.