Как отсортировать те строки таблицы pandas, в которых NaN встречается ровно 2 раза?

Рейтинг: 0Ответов: 2Опубликовано: 15.08.2023

введите сюда описание изображения

Таблица состоит из 5 столбцов и большого количества строк, в каждой строке содержится от 1 до 4 NaN, необходимо оставить те строки, в которых NaN встречается ровно 2 раза

Ответы

▲ 0Принят

Попробуй код:

import math

def nan_count(a):

    counter = 0

    for value in a.values:
    
        value = float(value)
    
        if math.isnan(value):
        
            counter += 1
        
    return counter

Это была функция для подсчета Nan в строке. Далее применяем ее к нашим данным.

data['nans'] = data.apply(lambda x: nan_count(x), axis = 1)

Так у тебя появится доп столбец с количеством Nan в строке, а там найдешь что тебе нужно:

data[data['nans'] == 2]

Примечание: будет работать, если у тебя во всех столбцах только числа, текста не должно быть.

▲ 1

Задачка решается 1 короткой строкой, ограничений на типы данных во фрейме нет:

df = df[df.isna().sum(axis=1).eq(2)]

Сначала делаем булев массив df.isna() - где NaN, будет True. Суммируем построчно sum(axis=1) - True суммируются как единицы. Потом проверяем полученные суммы на равенство 2-м eq(2) - и получаем булев массив, где в удаляемых строках будет False. После чего фильтруем df[...]

Полный пример с генерацией фрейма:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0,10,5*10).reshape(-1,5)).replace({1:np.NaN,2:np.NaN,5:'aaa'})
print('Было\n',df)
df = df[df.isna().sum(axis=1).eq(2)]
print('Стало\n',df)
Было
      0    1    2    3    4
0  4.0  3.0  NaN  9.0  NaN
1  8.0  NaN  3.0  0.0  9.0
2  4.0  NaN  4.0  NaN  4.0
3  8.0  aaa  NaN  NaN  NaN
4  4.0  aaa  9.0  9.0  aaa
5  6.0  0.0  6.0  NaN  8.0
6  NaN  8.0  aaa  9.0  NaN
7  4.0  0.0  NaN  0.0  NaN
8  0.0  NaN  3.0  6.0  3.0
9  aaa  aaa  NaN  6.0  7.0
Стало
      0    1    2    3    4
0  4.0  3.0  NaN  9.0  NaN
2  4.0  NaN  4.0  NaN  4.0
6  NaN  8.0  aaa  9.0  NaN
7  4.0  0.0  NaN  0.0  NaN