Столбец кодирования меток панд с меткой по умолчанию для недопустимых значений строк

1

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

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

  • 0
    Можете ли вы показать фиктивный кадр данных?
Теги:
pandas
dataframe
python-3.x
categorical-data

4 ответа

2

Данные от холода, используя 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
    Извините за задержку, upvote вернулся!
  • 1
    @coldspeed не беспокойся, чувак :-) рад видеть, что многие из нас все еще активны в выходные дни предлагают решения
Показать ещё 5 комментариев
2

Чтобы заменить все остальные значения на 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
    Он работает с использованием: maps = dict (zip (new_values, [1,2,3,4,5])), но я хочу использовать регулярные выражения для замены всех элементов, которые выглядят не только так же, как ['MANHATTAN', ' БРУКЛИН, КОРОЛЕВЫ, СТАТЕНСКИЙ ОСТРОВ, БРОНКС
2

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

Вы также можете использовать 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

Замена значений столбца 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню