Столбец кодирования меток панд с меткой по умолчанию для недопустимых значений строк - PullRequest
0 голосов
/ 08 декабря 2018

Для фрейма данных я заменил набор элементов в столбце с диапазоном значений следующим образом:

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

Проблема, которую я хочу заменить всеми остальными элементами в 'Borough', чтоне упоминалось ранее со значением 0 также мне нужно использовать регулярное выражение, потому что есть похожи на данные, например.07 BRONX, мне тоже нужно его заменить на 5 не 0

Ответы [ 4 ]

0 голосов
/ 08 декабря 2018

Вы также можете использовать np.where :

Создание фиктивного фрейма данных

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

Замена значенийстолбца Borough не в ключах с 0, используя np.where:

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
0 голосов
/ 08 декабря 2018

Чтобы заменить все остальные значения на 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))
0 голосов
/ 08 декабря 2018

Данные из холодного состояния с использованием map с fillna, все значения, отсутствующие на карте 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
0 голосов
/ 08 декабря 2018

Я вижу, вы хотите выполнить кодирование категории с некоторым наложенным порядком.Я бы рекомендовал использовать pd.Categorical с ordered=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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...