【问题标题】:fillna by referring another column but copy same column value using pandasfillna 通过引用另一列但使用 pandas 复制相同的列值
【发布时间】:2022-01-22 07:25:44
【问题描述】:

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

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

我希望我的输出如下所示

【问题讨论】:

    标签: python pandas dataframe numpy fillna


    【解决方案1】:
    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
    

    【讨论】:

    • 顺便说一句,我在您的代码中没有看到对 NA 的任何检查。它如何准确填写NA
    • 如果 NaN 不在顶部,这会失败,不是吗?
    • 是的,我也有同样的问题。
    • Easypeasy,.bfill().ffill()
    • 适用于这种情况,但由于 nth 在 NaN 值上模糊不清,我不知道它是否可扩展,但我想它对 OP 来说已经足够好了,所以足够好了
    【解决方案2】:

    groupby "grade" 并使用first 获取每个等级中的第一个非NaN 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'])
    

    或者代替第二行,你也可以使用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
    

    【讨论】:

    • 嗨@enke,如果我们要使用multiple columns 来映射,我们该怎么做?假设我希望基于两列在此处进行映射,df[grade'].map(mapper)
    • 如果我使用两列,它将成为一个数据框,map 不适用于数据框。
    • @TheGreat 也许您可以堆叠列、映射然后取消堆叠。
    猜你喜欢
    • 2017-01-16
    • 1970-01-01
    • 2022-11-12
    • 2023-02-13
    • 2017-02-07
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    相关资源
    最近更新 更多