【问题标题】:Fill np.nan condition within for/if-else loop在 for/if-else 循环中填充 np.nan 条件
【发布时间】:2020-03-01 00:49:11
【问题描述】:

我已经为此工作了一段时间,但似乎无法找到我需要的答案。假设我有一个如下的数据框。

我想做的是根据df['home_work'] 列中的值填充df['gender'] 的最后三行,特别是如果home_work > 9,则m,如果不是,则f。请记住,这只是一个编造的数据集,我保证不会冒犯任何人!

enr = pd.DataFrame({'name_id':[1254, 1359, 1254, 1296, 1353, 2656], 
                   'enrollment_term':['spring 2018', 'spring 2018', 'fall 2018', 'spring 2018', 'spring 2018', 'fall 2020'],
                   'gpa_term': [2.93, np.nan, 1.65, 4.00, 3.95, 2.92],
                   'dog_owner':[0,1,1,1, 1, 0],
                   'salary':[50657, 90658, np.nan, 104352, np.nan, 102043],
                   'home_work':[34, np.nan, 12, 9, 8, 27],
                   'gender':['m','f','f',np.nan, np.nan, np.nan]})

enr

下面是我尝试的代码,但它在下面显示了错误:

for i in df['gender'].isna():
    if df['home_work'][i] > 9:
        df['gender'][i].fillna('m')
    else:
        df['gender'][i].fillna('f')
KeyError: False

任何帮助都会非常感谢,因为我已经为此工作了一段时间。我有一个 90K + 的数据集,我想调整这项工作,并想创建一个函数来简化这个过程但遇到了减速!

我遇到的问题是 np.nan 默认并填写 gender 的值,如果它不满足要求。想法?


#已编辑

假设我有以下df:

enr = pd.DataFrame({'name_id':[1254, 1359, 1254, 1296, 1353, 2656], 
                   'enrollment_term':['spring 2018', 'spring 2018', 'fall 2018', 'spring 2018', 'spring 2018', 'fall 2020'],
                   'gpa_term': [2.93, np.nan, 1.65, 4.00, 3.95, 2.92],
                   'dog_owner':[0,1,1,1, 1, 0],
                   'salary':[50657, 90658, np.nan, 104352, np.nan, 102043],
                   'home_work':[np.nan, np.nan, 0.7, 0.3, 0.64, 0.49],
                   'gender':[0, 1, 1,np.nan, np.nan, np.nan]})

我想根据home_work 估算enr['gender']。如果enr['home_work'] >= 0.5,则enr['gender'] == 0,否则(只要enr['home_work'] != np.nanenr['gender'] == 1

我不想要的是在enr[gender] 中估算值,而他们的enr['home_work']np.nan我尝试了许多不同的技术,但似乎都估算为 1. 想法?

【问题讨论】:

    标签: python pandas keyerror


    【解决方案1】:

    numpy.whereSeries.fillna 一起使用:

    enr['gender'] = np.where(enr['home_work'] > 9,  
                             enr['gender'].fillna('m'),
                             enr['gender'].fillna('f'))
    

    或者通过2个掩码分别过滤:

    m = enr['gender'].isna()
    enr.loc[m, 'gender'] = np.where(enr['home_work'] > 9,  'm',  'f')[m]
    

    print (enr)
       name_id enrollment_term  gpa_term  dog_owner    salary  home_work gender
    0     1254     spring 2018      2.93          0   50657.0         34      m
    1     1359     spring 2018       NaN          1   90658.0         42      f
    2     1254       fall 2018      1.65          1       NaN         12      f
    3     1296     spring 2018      4.00          1  104352.0          9      f
    4     1353     spring 2018      3.95          1       NaN          8      f
    5     2656       fall 2020      2.92          0  102043.0         27      m
    

    编辑:

    m = enr['gender'].isna() & enr['home_work'].notna()
    enr.loc[m, 'gender'] = np.where(enr['home_work'] >= 0.5, 0, 1)[m]
    print (enr)
       name_id enrollment_term  gpa_term  dog_owner    salary  home_work  gender
    0     1254     spring 2018      2.93          0   50657.0        NaN     0.0
    1     1359     spring 2018       NaN          1   90658.0        NaN     1.0
    2     1254       fall 2018      1.65          1       NaN       0.70     1.0
    3     1296     spring 2018      4.00          1  104352.0       0.30     1.0
    4     1353     spring 2018      3.95          1       NaN       0.64     0.0
    5     2656       fall 2020      2.92          0  102043.0       0.49     1.0
    

    【讨论】:

    • 谢谢,我试试看。我遇到了np.where 的问题,但我也没有完全掌握它!回到书本!
    • 您好,先生,还没睡吗? :-)
    • @jezrael 找到你了~
    • 感谢您在此处所做的努力,但在我的实际数据集中,您的 np.where 技术默认为在我希望列保持 np.nan 时对其进行插补。因此,当我希望它们保留时,它会删除所有 np.nan 值,并且仅在 enr[salary] 不为空时进行估算。想法?
    • 我很感激。我会这样做。
    【解决方案2】:

    让我们试试map的值和where

    df.gender=df.gender.where(df.gender.notna(),df.home_work.gt(9).map({True:'m',False:'f'})) 
    
    
    df
       name_id enrollment_term  gpa_term  dog_owner    salary  home_work gender
    0     1254     spring 2018      2.93          0   50657.0       34.0      m
    1     1359     spring 2018       NaN          1   90658.0        NaN      f
    2     1254       fall 2018      1.65          1       NaN       12.0      f
    3     1296     spring 2018      4.00          1  104352.0        9.0      f
    4     1353     spring 2018      3.95          1       NaN        8.0      f
    5     2656       fall 2020      2.92          0  102043.0       27.0      m
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-08
      • 2017-08-02
      • 2019-12-04
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      相关资源
      最近更新 更多