首页 文章

Pandas标签编码列,其中包含无效行值的默认标签

提问于
浏览
0

对于数据框,我用一系列值替换了一列中的项目,如下所示:

df['borough_num'] = df['Borough'].replace(regex=['MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND','BRONX'], value=[1, 2, 3, 4,5])

我想要替换之前未提及的值为0的'Borough'中所有其余元素的问题我也需要使用正则表达式,因为看起来像数据,例如 . 07 BRONX,我还需要将其替换为5而不是0

4 回答

  • 2

    你也可以使用np.where

    创建一个虚拟DataFrame

    df = pd.DataFrame({'Borough': ['MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND','BRONX', 'TEST']})
    df
        Borough
    0   MANHATTAN
    1   BROOKLYN
    2   QUEENS
    3   STATEN ISLAND
    4   BRONX
    5   TEST
    

    你的行动:

    df['borough_num'] = df['Borough'].replace(regex=['MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND','BRONX'], value=[1, 2, 3, 4,5])
    df
    
        Borough   borough_num
    0   MANHATTAN       1
    1   BROOKLYN        2 
    2   QUEENS          3
    3   STATEN ISLAND   4
    4   BRONX           5
    5   TEST           TEST
    

    使用np.where替换列中的Borough值而不是0中的键:

    keys = ['MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND','BRONX']
    df['Borough'] = np.where(~df['Borough'].isin(keys), 0 ,df['Borough'])
    df
    
        Borough    borough_num
    0   MANHATTAN       1
    1   BROOKLYN        2
    2   QUEENS          3
    3   STATEN ISLAND   4
    4   BRONX           5
    5   0             TEST
    
  • 2

    我看到你想用一些强加的顺序执行类别编码 . 我建议使用 pd.Categoricalordered=True

    df = pd.DataFrame({
        'Borough': ['QUEENS', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'INVALID']})
    df
    
         Borough
    0     QUEENS
    1      BRONX
    2  MANHATTAN
    3   BROOKLYN
    4    INVALID
    
    keys = ['MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND','BRONX']
    df['borough_num'] = pd.Categorical(
        df['Borough'], categories=keys, ordered=True).codes+1
    
    df
    
         Borough  borough_num
    0     QUEENS            3
    1      BRONX            5
    2  MANHATTAN            1
    3   BROOKLYN            2
    4    INVALID            0
    

    pd.Categorical 将无效字符串返回为-1:

    pd.Categorical(
             df['Borough'], categories=keys, ordered=True).codes      
    array([ 2,  4,  0,  1, -1], dtype=int8)
    

    无论如何,这应该比使用 replace 快得多,但作为参考,你可以用 replace 和字典做到这一点:

    from collections import defaultdict
    
    d = defaultdict(int)
    d.update(dict(zip(keys, range(len(keys)))))
    df['borough_num'] = df['Borough'].map(d)
    
    df
    
         Borough  borough_num
    0     QUEENS            2
    1      BRONX            4
    2  MANHATTAN            0
    3   BROOKLYN            1
    4    INVALID            0
    
  • 0

    要将所有其他值替换为0,您可以执行以下操作:

    # create maps
    new_values = ['MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND','BRONX']
    maps = dict(zip(new_values, [1]*len(new_values)))
    
    # map the values
    df['borough_num'] = df['Borough'].apply(lambda x: maps.get(x, 0))
    
  • 2

    使用 mapfillna 来冷的数据,所有不在 Map dict 中的值都会返回 NaN ,那么我们只需 fillna

    df.Borough.map(dict(zip(['QUEENS', 'BRONX'],[1,2]))).fillna(0).astype(int)
    0    1
    1    2
    2    2
    3    0
    Name: Borough, dtype: int32
    

相关问题