代码之家  ›  专栏  ›  技术社区  ›  Pumpkin C

我如何才能实现NP.Where(df[varaible]in['value1','value2'])

  •  5
  • Pumpkin C  · 技术社区  · 5 年前

    嗨,我想把一个分类变量的值改为 other 在这种情况下 ['value1','value2']

    这是我的代码:

    random_sample['NAME_INCOME_TYPE_ind'] = np.where(random_sample['NAME_INCOME_TYPE'] in ['Maternity leave', 'Student']), 'Other')
    

    我试着加 .any() 在这行代码的不同位置,但它仍然不能解决错误。 值错误:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。

    2 回复  |  直到 5 年前
        1
  •  1
  •   yatu Sayali Sonawane    5 年前

    你可以使用 str.contains 检查条件是否满足:

    l = ('|').join(['Maternity leave', 'Student'])
    m = random_sample['NAME_INCOME_TYPE'].str.contains(l)
    

    你也可以生成 m 使用 .isin :

    random_sample['NAME_INCOME_TYPE'].isin(['Maternity leave', 'Student'])
    

    然后使用 np.where . 但是,请注意,不能只指定两个值中的一个,根据条件从中进行选择,必须同时指定这两个值 x y . 对于你的案件,你可以使用 df['NAME_INCOME_TYPE'] other 作为 X Y :

    random_sample['NAME_INCOME_TYPE_ind'] = np.where(m, 
                                                    'Other',
                                                    random_sample['NAME_INCOME_TYPE'])
    

    对示例数据帧进行测试:

    df = pd.DataFrame({'NAME_INCOME_TYPE':['word1','word2','Student']})
    
    l = ('|').join(['Maternity leave', 'Student'])
    m = random_sample['NAME_INCOME_TYPE'].str.contains(l)
    df['NAME_INCOME_TYPE_ind'] = np.where(m, 'Other', df['NAME_INCOME_TYPE'])
    
           NAME_INCOME_TYPE NAME_INCOME_TYPE_ind
    0            word1                word1
    1            word2                word2
    2          Student                Other
    
        2
  •  2
  •   jpp    5 年前

    使用 Categorical Data 对于分类变量

    当处理分类词时,你可以 替换类别 用另一个而不是替换字符串。这对内存和性能都有好处,因为熊猫在内部使用分类数据的因子分解。

    df = pd.DataFrame({'NAME_INCOME_TYPE': ['Employed', 'Maternity leave',
                                            'Benefits', 'Student']})
    
    # turn object series to categorical
    label_col = 'NAME_INCOME_TYPE'
    df[label_col] = df[label_col].astype('category')
    
    # define others
    others = ['Maternity leave', 'Student']
    others_label = 'Other'
    
    # add new category and replace existing categories
    df[label_col] = df[label_col].cat.add_categories([others_label])
    df[label_col] = df[label_col].replace(others, others_label)
    
    print(df)
    
      NAME_INCOME_TYPE
    0         Employed
    1            Other
    2         Benefits
    3            Other
    

    您还可以使用方法链接更简洁地编写此内容:

    # define others
    others, others_label = ['Maternity leave', 'Student'], 'Other'
    
    # turn to categorical, add category, then replace
    df['NAME_INCOME_TYPE'] = df['NAME_INCOME_TYPE'].astype('category')\
                                                   .cat.add_categories([others_label])\
                                                   .replace(others, others_label)