当存在多个Null值时,正在删除带有pandas数据帧的行



我试图遍历数据帧中的每一行,检查所选行是否有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.dropnathresh一起使用,但因为它用于非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 NaNs,则可以过滤行

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

最新更新