【问题标题】:Replace nan values based on row conditions根据行条件替换 nan 值
【发布时间】:2018-11-29 13:19:56
【问题描述】:

这是我的原始数据框 df_:

 index_label,id_label,morning,evening,night
 a,x,nan,eating,sleep
 b,x,shower,eating,nan
 c,x,nan,nan,nan
 d,y,work,reading,travel
 e,y,nan,reading,nan
 f,y,work,nan,nan
 g,z,shower,nan,travel
 h,z,shower,eating,nan

我尝试用基于相同 id_labels 的同一数据帧 df 中的非值替换 nan 值。需要从 nan 中清除“早晨”、“晚上”的每一列。 “夜”列应保持不变。

例如,我为“早上”专栏写这个

crit_nan_ = pd.isna(df_[['morning']])
df_nan_ = df_.loc[crit_nan_]
df_clean_ = df_.loc[~crit_nan_]

但是我如何获得结果数据框:

 index_label,id_label,morning,evening,night
 a,x,shower,eating,sleep
 b,x,shower,eating,nan
 c,x,shower,eating,nan
 d,y,work,reading,travel
 e,y,work,reading,nan
 f,y,work,reading,nan
 g,z,shower,eating,travel
 h,z,shower,eating,nan

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    使用df.groupby & df.fillna可以得到结果dataframe:

    def fill_na(x):
        return x.fillna(method="ffill").fillna(method="bfill")
    
    for col in ("morning", "evening", ):
        d[col] = d.groupby("id_label")[col].transform(fill_na)
    

    【讨论】:

    • 谢谢 Kopytok。
    【解决方案2】:

    这是一种方法,使用字典来存储一系列有效值。

    cats = ('morning', 'evening', 'night')
    
    maps = {k: df.dropna(subset=[k]).drop_duplicates('id_label').set_index('id_label')[k] \
               for k in cats}
    
    for col in cats:
        df[col] = df[col].fillna(df['id_label'].map(maps[col]))
    
    print(df)
    
       index_label id_label morning  evening   night
    0            a        x  shower   eating   sleep
    1            b        x  shower   eating   sleep
    2            c        x  shower   eating   sleep
    3            d        y    work  reading  travel
    4            e        y    work  reading  travel
    5            f        y    work  reading  travel
    6            g        z  shower   eating  travel
    7            h        z  shower   eating  travel
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 2022-01-19
      • 1970-01-01
      • 2019-12-02
      • 1970-01-01
      • 2017-12-05
      • 1970-01-01
      相关资源
      最近更新 更多