代码之家  ›  专栏  ›  技术社区  ›  Rajesh Ahir

如何在pandas数据帧的列中找到连续的null(NaN)?

  •  1
  • Rajesh Ahir  · 技术社区  · 2 年前

    我有一个熊猫数据帧,如下所示:

    import pandas as pd
    nan = float('nan')
    data = {'col1': [1, nan, nan, nan, nan, 1, nan, nan], 
            'col2': [1, 1, nan, 1, 0, 0, 1, 0], 
            'col3': [nan, 0, nan, 1, 0, nan, nan, nan], 
            'col4': [1, 0, 0, 1, 0, 1, 1, 1]}
    df = pd.DataFrame(data)
    

    df

    |col1|  |col2|  |col3|  |col4|
    | 1  |  |  1 |  | NaN|  | 1  |
    |NaN |  |  1 |  | 0  |  | 0  |
    |NaN |  | NaN|  | NaN|  | 0  |
    |NaN |  |  1 |  | 1  |  | 1  |
    |NaN |  |  0 |  | 0  |  | 0  |
    | 1  |  |  0 |  | NaN|  | 1  |
    |NaN |  |  1 |  | NaN|  | 1  |
    |NaN |  |  0 |  | NaN|  | 1  |
    

    我想计算每列的连续null(NaN)值的数量,如果有两个以上的连续null,我想得到它的最大值。

    对于上面的df,我会得到:

    df_nulls = ['col1': 4, 'col2': 0, 'col3': 3, 'col4': 0]
    

    根据以上结果,应删除具有两个以上连续Null的列。在这种情况下,最终的数据帧应该只包含col2和col4。 我发现了类似的线程,但没有一个解决上述问题。 我该如何解决这个问题?提前谢谢。

    2 回复  |  直到 2 年前
        1
  •  1
  •   Panda Kim    2 年前

    密码

    transform + max

    out = (df
           .transform(lambda x: x.isna().groupby(x.notna().cumsum()).cumsum())
           .max()
           .mask(lambda x: x.eq(1), 0)
           .to_dict()
    )
    

    出来

    {'col1': 4, 'col2': 0, 'col3': 3, 'col4': 0}
    

    或使用 agg 相反 使改变 + 最大值

    out = (df
           .agg(lambda x: x.isna().groupby(x.notna().cumsum()).cumsum().max())
           .mask(lambda x: x.eq(1), 0)
           .to_dict()
    )
    

    相同的结果

        2
  •  0
  •   Chris Fu    2 年前
    >>> (
    ...     df.notna().cumsum().apply(
    ...         lambda s: (
    ...             s.value_counts(sort=False).pipe(
    ...                 lambda s: s - (s.index != 0)
    ...             ).max()
    ...         )
    ...     )
    ... ).replace(1, 0).to_dict()
    {'col1': 4, 'col2': 0, 'col3': 3, 'col4': 0}
    

    编辑

    适用于以下情况 df 包含前导NaN。