我试图遍历数据帧中的每一行,检查所选行是否有3个以上的空值(这一部分有效(,然后删除整行。然而,在试图从数据帧中删除所述行时,我遇到了一个错误:
属性错误:"NoneType"对象没有属性"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
一起使用,但因为它用于非NaNs列,所以需要减去列的长度:
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
s,则可以过滤行
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
(。
假设这个数据帧
>>> 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