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) 例如:等级 STA
在 row 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
我有一个如下所示的数据框
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) 例如:等级 STA
在 row 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