简体   繁体   English

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

[英]fillna by referring another column but copy same column value using pandas

I have a dataframe like as shown below我有一个 dataframe 如下图所示

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']})

I would like to do the below我想做以下

a) Fill NA's in sub_code column by referring grade column. a) 通过参考grade列在sub_code列中填写 NA。

b) For ex: grade STA has corresponding sub_code non-NA values in row 1,3 and 4 ( row 0 has NA value ) b)例如:等级STArow 1,3 and 4行具有相应的sub_code非 NA 值( row 0 has NA value

c) Copy the very 1st non-NA ( CSE01 ) value from grade column and put it in sub_code column ( row 0 ) c) 从grade列复制第一个非 NA ( CSE01 ) 值并将其放入sub_code列 ( row 0 )

I tried the below我尝试了以下

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

I expect my output to be like as below我希望我的 output 如下所示

在此处输入图像描述

groupby "grade" and use first to get the first non-NaN sub_code in each grade. groupby "grade" 并使用first获取每个等级中的第一个非 NaN 子代码。 Then use np.where to fill NaN values in "sub_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'])

or instead of the second line, you can also use fillna :或者代替第二行,您也可以使用fillna

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

Output: Output:

  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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM