【问题标题】:Pandas: Checking for NaN using rolling functionPandas:使用滚动功能检查 NaN
【发布时间】:2019-03-27 17:18:17
【问题描述】:

我有一个带有变量“A”的数据框,我想创建一个滚动 Nan 检查器,这样如果所有 3 个(秒)单元格(当前单元格和前两个单元格),新变量“rolling_nan”= 1 ) 是 NaN,否则 "rolling_nan" = 0。

我正在应用一个函数,因为 .rolling pandas 函数不支持 isna()。但是我得到以下内容。另外我不确定如何在 NaN 检查器中包含相同的行值。

import pandas as pd
import numpy as np

idx = pd.date_range('2018-01-01', periods=10, freq='S')
df = pd.DataFrame({"A":[1,2,3,np.nan,np.nan,np.nan,6,7,8,9]}, index = idx)
df

def isna_func(x):
    return 1 if pd.isna(x).all() == True else 0
df['rolling_nan'] = df['A'].rolling(3).apply(isna_func)
df

                    A   rolling_nan
2018-01-01 00:00:00 1.0 NaN
2018-01-01 00:00:01 2.0 NaN
2018-01-01 00:00:02 3.0 0.0
2018-01-01 00:00:03 NaN NaN
2018-01-01 00:00:04 NaN NaN
2018-01-01 00:00:05 NaN NaN
2018-01-01 00:00:06 6.0 NaN
2018-01-01 00:00:07 7.0 NaN
2018-01-01 00:00:08 8.0 0.0
2018-01-01 00:00:09 9.0 0.0

在上面的示例中,rolling_nan 应仅在时间戳 2018-01-01 00:00:05 处等于 1,否则为 0。

【问题讨论】:

    标签: pandas apply nan rolling-computation


    【解决方案1】:

    你可以换个思路标记所有notna,然后找到max

    df.A.notna().rolling(3).max()==0
    Out[316]: 
    2018-01-01 00:00:00    False
    2018-01-01 00:00:01    False
    2018-01-01 00:00:02    False
    2018-01-01 00:00:03    False
    2018-01-01 00:00:04    False
    2018-01-01 00:00:05     True
    2018-01-01 00:00:06    False
    2018-01-01 00:00:07    False
    2018-01-01 00:00:08    False
    2018-01-01 00:00:09    False
    Freq: S, Name: A, dtype: bool
    

    重新分配

    df['rollingnan']=(df.A.notna().rolling(3).max()==0).astype(int)
    df
    Out[320]: 
                           A  rollingnan
    2018-01-01 00:00:00  1.0           0
    2018-01-01 00:00:01  2.0           0
    2018-01-01 00:00:02  3.0           0
    2018-01-01 00:00:03  NaN           0
    2018-01-01 00:00:04  NaN           0
    2018-01-01 00:00:05  NaN           1
    2018-01-01 00:00:06  6.0           0
    2018-01-01 00:00:07  7.0           0
    2018-01-01 00:00:08  8.0           0
    2018-01-01 00:00:09  9.0           0
    

    或者根据你自己的想法使用all

    df['A'].isna().rolling(3).apply(lambda x : x.all(),raw=True)
    Out[323]: 
    2018-01-01 00:00:00    NaN
    2018-01-01 00:00:01    NaN
    2018-01-01 00:00:02    0.0
    2018-01-01 00:00:03    0.0
    2018-01-01 00:00:04    0.0
    2018-01-01 00:00:05    1.0
    2018-01-01 00:00:06    0.0
    2018-01-01 00:00:07    0.0
    2018-01-01 00:00:08    0.0
    2018-01-01 00:00:09    0.0
    Freq: S, Name: A, dtype: float64
    

    【讨论】:

    • 感谢您的回答。如果我想在滚动函数中创建最后一个非 NaN 的列,我该如何调整函数,因为滚动函数也不支持 .last()。因此,使用上面的示例,新列将在2018-01-01 00:00:03 2018-01-01 00:00:04 显示最后一个有效值3,在2018-01-01 00:00:05 将显示NaN
    • 在您提供的链接中,他们正在搜索最大值,在我的情况下,我是最后一个值,可能不是最大值。
    猜你喜欢
    • 2023-04-07
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    相关资源
    最近更新 更多