【问题标题】:counting NaNs in 'for' loop in python在python的'for'循环中计算NaN
【发布时间】:2019-02-02 06:10:08
【问题描述】:

我正在尝试迭代 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

【问题讨论】:

标签: python-3.x pandas numpy 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 个修复:

  1. df.iloc[i,0] == np.nan 替换为math.isnan(val)
  2. 删除最后的period_x.append(sum_x),并添加第一个周期值(因为我们从第二个值开始迭代)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 2012-11-07
    • 2021-05-26
    • 2016-03-21
    相关资源
    最近更新 更多