代码之家  ›  专栏  ›  技术社区  ›  The Great

通过引用另一列填充NA,但使用复制复制相同的列值

  •  1
  • The Great  · 技术社区  · 3 年前

    我有一个如下所示的数据帧

    df = pd.DataFrame(
        {'sub_code' : [np.nan, 'CSE01', np.nan, 
                       'CSE02', 'CSE03', 'CSE02',
                       'CSE03', 'CSE02'],
         'stud_level' : [101, 101, 101, 101, 
                      101, 101, 101, 101],
         'grade' : ['STA','STA','PSA','STA','STA','SSA','PSA','QSA']})
    

    我想做下面的事情

    a) 填补空缺 sub_code 引用列 grade

    b) 例如:年级 STA 有相应的 子代码 非NA值 row 1,3 and 4 ( row 0 has NA value )

    c) 复制第一个非NA( CSE01 )价值来自 等级 然后把它放进去 子代码 纵队( row 0 )

    我试过下面的方法

    m = df['sub_code'].isna()
    df.loc[m, 'sub_code'] = np.where(df.loc[m, 'grade'].ne(np.nan), df['sub_code'], 'not filled')
    

    我希望我的输出如下

    enter image description here

    2 回复  |  直到 3 年前
        1
  •  1
  •   wwnde    3 年前
    df['sub_code'] =df.groupby(['grade'])['sub_code'].bfill().ffill()
    
    
    
       sub_code  stud_level grade
    0    CSE01         101   STA
    1    CSE01         101   STA
    2    CSE03         101   PSA
    3    CSE02         101   STA
    4    CSE03         101   STA
    5    CSE02         101   SSA
    6    CSE03         101   PSA
    7    CSE02         101   QSA
    
        2
  •  1
  •   enke    3 年前

    groupby “等级”和用途 first 获取每个年级的第一个非NaN sub_代码。然后使用 np.where 要在“子代码”中填写NaN值:

    mapper = df.groupby('grade')['sub_code'].first()
    df['sub_code'] = np.where(df['sub_code'].isna(), df['grade'].map(mapper), df['sub_code'])
    

    或者,您也可以使用 fillna :

    df['sub_code'] = df.set_index('grade')['sub_code'].fillna(mapper)
    

    输出:

      sub_code  stud_level grade
    0    CSE01         101   STA
    1    CSE01         101   STA
    2    CSE03         101   PSA
    3    CSE02         101   STA
    4    CSE03         101   STA
    5    CSE02         101   SSA
    6    CSE03         101   PSA
    7    CSE02         101   QSA
    
    推荐文章