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

NaNs熊猫qcut

  •  1
  • Aenaon  · 技术社区  · 2 年前

    我试图将数据帧的行元素分配到四分位数中。但是,这些行只能具有NaN,例如:

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'A': [np.nan, 20, 30, 40],
                       'B': [np.nan, np.nan, 31, 41],
                       'C': [np.nan, 22, 32, 42],
                       'D': [np.nan, 23, 33, 43],
                       'E': [np.nan, np.nan, 34, np.nan]
                      }
    )
    

    我正试图用qcut来存储数据帧,但由于最上面一行的原因,我遇到了一个错误(我想)。当我跑步时

    df.T.apply(lambda x: x.where(not (x.isna().all()), pd.qcut(x, 4, labels=False)).T)
    

    它让我摔倒了

    IndexError: index -1 is out of bounds for axis 0 with size 0
    

    理想情况下,我想保留 NaNs 在最上面一行,并应用 qcut 其余部分的功能

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

    一个可能的解决方案:

    (df.T.apply(
        lambda x: x.dropna().pipe(pd.qcut, 4, labels=False) 
        if not x.isna().all() else x).T)
    

    输出:

         A    B    C    D    E
    0  NaN  NaN  NaN  NaN  NaN
    1  0.0  NaN  1.0  3.0  NaN
    2  0.0  0.0  1.0  2.0  3.0
    3  0.0  1.0  2.0  3.0  NaN