fillna 通过引用另一列但使用 pandas 复制相同的列值

fillna by referring another column but copy same column value using pandas

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

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) 参照grade列在sub_code列中填写NA。

b) 例如:等级 STArow 1,3 and 4 (row 0 has NA value)

中有对应的 sub_code 非 NA 值

c) 从 grade 列复制第一个非 NA (CSE01) 值并将其放入 sub_code 列 (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')

我希望我的输出如下所示

groupby“年级”并使用first得到每个年级的第一个non-NaNsub_code。然后使用np.where在“sub_code”中填充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
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