подсчет NaN в цикле for в питоне - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь перебрать строки в 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 Ответ

0 голосов
/ 27 августа 2018

Вот пересмотренная версия вашего кода:

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 исправления:

  1. Замена df.iloc[i,0] == np.nan на math.isnan(val)
  2. Удалить period_x.append(sum_x) в конце и вместо этого добавить значение первого периода (поскольку мы начинаем итерацию со второго значения)
...