Как удалить строки, если в них много NaN?
Есть фрейм вида:
a b c d
NaN 4 NaN NaN
24 25 34 NaN
NaN 12 NaN NaN
34 NaN 2 34
NaN NaN 19 11
42 NaN 29 NaN
54 NaN 11 12
Нужно удалить из него строки, в которых число NaN превышает число столбцов с численными значениями или равно ему.
Желаемый результат:
a b c d
24 25 34 NaN
34 NaN 2 34
54 NaN 11 12
Мой код:
import pandas as pd
import numpy as np
df = pd.DataFrame([[np.NaN, 4, np.NaN, np.NaN], [24, 25, 34, np.NaN], [np.NaN, 12, np.NaN, np.NaN],
[34, np.NaN, 2, 34], [np.NaN, np.NaN, 19, 11], [42, np.NaN, 29, np.NaN], [54, np.NaN, 11, 12]])
df.rename({0: 'a', 1: 'b', 2: 'c', 3: 'd'}, axis=1, inplace=True)
columns_count = df.shape[1] # Считаем число столбцов
for row in df:
NaN_count = 0
for i in row:
if i == None:
NaN_count +=1
if NaN_count >= columns_count:
df = df.drop(index=[row]) # Удаляем строку
print(df)
Почему-то не удаляет строки.
Ответы (2 шт):
Автор решения: MaxU
→ Ссылка
threshold = df.shape[1] // 2
res = df.loc[df.isna().sum(axis=1).lt(threshold)]
результат:
In [13]: res
Out[13]:
a b c d
1 24.0 25.0 34.0 NaN
3 34.0 NaN 2.0 34.0
6 54.0 NaN 11.0 12.0
Автор решения: strawdog
→ Ссылка
res = df.dropna(thresh=len(df.columns)//2+1)
res:
a b c d
1 24.0 25.0 34.0 NaN
3 34.0 NaN 2.0 34.0
6 54.0 NaN 11.0 12.0