Подсчет NaN в цикле for в питоне
Я пытаюсь перебрать строки в df и подсчитать последовательные строки, когда определенное значение равно NaN или 0, и начать отсчет, если значение изменится с NaN или 0. Я хотел бы получить что-то вроде этого:
Value Period
0 1
0 2
0 3
NaN 4
21 NaN
4 NaN
0 1
0 2
NaN 3
Я написал функцию, которая принимает фрейм данных в качестве аргумента и возвращает его с дополнительным столбцом, который обозначает количество:
def calc_period(df):
period_x = []
sum_x = 0
for i in range(1,df.shape[0]):
if df.iloc[i,0] == np.nan or df.iloc[i,0] == 0:
sum_x += 1
period_x.append(sum_x)
else:
period_x.append(None)
sum_x = 0
period_x.append(sum_x)
df['period_x'] = period_x
return df
Функция работает хорошо, когда значение равно 0. Но когда значение равно NaN, счетчик также равен NaN, и я получаю следующий результат:
Value Period
0 1
0 2
0 3
NaN NaN
NaN NaN
1 ответ
Решение
Вот пересмотренная версия вашего кода:
import pandas as pd
import numpy as np
import math
def is_nan_or_zero(val):
return math.isnan(val) or val == 0
def calc_period(df):
is_first_nan_or_zero = is_nan_or_zero(df.iloc[0, 0])
period_x = [1 if is_first_nan_or_zero else np.nan]
sum_x = 1 if is_first_nan_or_zero else 0
for i in range(1,df.shape[0]):
val = df.iloc[i,0]
if is_nan_or_zero(val):
sum_x += 1
period_x.append(sum_x)
else:
period_x.append(None)
sum_x = 0
df['period_x'] = period_x
return df
Было 2 исправления:
- Замена
df.iloc[i,0] == np.nan
сmath.isnan(val)
- Удалить
period_x.append(sum_x)
в конце, и вместо этого добавьте первое значение периода (так как мы начинаем итерацию со второго значения)