代码之家  ›  专栏  ›  技术社区  ›  mabiel

获取带有NaN的行以及NaN行的前后行

  •  0
  • mabiel  · 技术社区  · 1 年前

    我有一个示例数据帧中的以下片段:

    df = pd.DataFrame({'location': ['Seattle', np.nan, 'Portland', 'San Francisco'],
                       'time': ['2022-06-01 12:00:00', '2022-06-01 13:00:00', '2022-06-01 14:00:00', '2022-06-01 15:00:00']})
    

    我想检索location=nan的行以及上面和下面的非nan行。

    所以它将是这样

    df = pd.DataFrame({'location': ['Seattle', np.nan, 'Portland'], 'time': ['2022-06-01 12:00:00', '2022-06-01 13:00:00', '2022-06-01 14:00:00']})
    

    我怎样才能做到这一点?数据帧比具有不同情况的示例代码段要大。但通常应该是:检索所有带有NaN的行,加上上面或下面的下一个非NaN行。

    2 回复  |  直到 1 年前
        1
  •  1
  •   jezrael    1 年前

    使用 boolean indexing 链质量为 | 用于逐位 OR 以下为:

    m = df['location'].isna()
    
    df = df[m.shift(fill_value=False) | m.shift(-1, fill_value=False) | m]
    print (df)
       location                 time
    0   Seattle  2022-06-01 12:00:00
    1       NaN  2022-06-01 13:00:00
    2  Portland  2022-06-01 14:00:00
    
        2
  •  1
  •   mozway    1 年前

    我会使用居中 rolling 为生成掩码 boolean indexing 以下为:

    N = 1
    m = (df['location'].isna()
          .rolling(2*N+1, min_periods=1, center=True)
          .max().eq(1)
         )
    
    out = df.loc[m]
    

    您可以通过更改 N

    输出:

       location                 time
    0   Seattle  2022-06-01 12:00:00
    1       NaN  2022-06-01 13:00:00
    2  Portland  2022-06-01 14:00:00