Создание нового двоичного столбца путем сопоставления последовательностей из словаря

Deepak M спросил: 13 июня 2018 в 12:05 в: python

Хороший день,

У меня есть такой словарь:

dict_one = {M:[1, 3, 5, 10, 12, 14], A:[2, 4, 6, 7, 9, 11, 13, 15]}

Я хочу сопоставить словарь с фреймом данных с уважаемыми значениями внутри клавиш. Однако я хочу превратить ключи M и A в двоичные числа, где M = 1 и A = 0, и поместить их в новый столбец, подобный этому. Новый сопоставленный столбец должен отображать новые значения на основе столбца "объект", который является уже существующим столбцом в существующем фрейме данных.

 object    new_column
   1           1
   2           0
   3           1
   4           0
   5           1
   6           0

Как мне это сделать? Помощь будет по-настоящему оценена. Спасибо

2 ответа

Есть решение
sacul ответил: 13 июня 2018 в 12:30

Вы можете создать свой фреймворк, используя понимание списка, а затем использовать map:

df = (pd.DataFrame([(x,key) for key,i in dict_one.items() for x in i],
                  columns=['object', 'new_column'])
      .sort_values('object'))df['new_column'] = df.new_column.map({'M':1,'A':0})>>> df
    object  new_column
0        1           1
6        2           0
1        3           1
7        4           0
2        5           1
8        6           0
9        7           0
10       9           0
3       10           1
11      11           0
4       12           1
12      13           0
5       14           1
13      15           0

Вы даже можете сделать все за один раз, используя replace вместо map:

df = (pd.DataFrame([(x,key) for key,i in dict_one.items() for x in i],
                  columns=['object', 'new_column'])
      .sort_values('object')
      .replace({'new_column':{'M':1, 'A':0}}))

EDIT На основе ваших комментариев кажется, что вы начинаете с кадра данных , который я предполагаю, выглядит примерно так:

>>> df
   object
0       1
1       2
2       3
3       4
4       5
5       6

В этом случае я считаю, что лучше всего создать новый словарь сопоставления и просто использовать map

new_dict = {x:(1 if key=='M' else 0) for key, i in dict_one.items() for x in i}
# {1: 1, 3: 1, 5: 1, 10: 1, 12: 1, 14: 1, 2: 0, 4: 0, 6: 0, 7: 0, 9: 0, 11: 0, 13: 0, 15: 0}df['new_column'] = df.object.map(new_dict)>>> df
   object  new_column
0       1           1
1       2           0
2       3           1
3       4           0
4       5           1
5       6           0
Deepak M ответил: 13 июня 2018 в 12:13
Привет @sacul У меня уже есть dataframe! Итак, как же я это делаю?
Deepak M ответил: 13 июня 2018 в 12:16
Я хотел спросить, как применить его к существующему фрейму данных. Как будто мне не нужно его создавать, у меня уже есть одно, но нужно применить это к нему. Давайте просто скажем, что у меня уже есть фрейм данных с столбцом 'object' @sacul
Deepak M ответил: 13 июня 2018 в 12:24
Я хочу создать новый столбец в существующем dataframe @sacul
sacul ответил: 13 июня 2018 в 12:31
Смотрите мои правки, это разрешает?
Deepak M ответил: 13 июня 2018 в 03:37
Да, это так. Большое спасибо !
Wen ответил: 13 июня 2018 в 02:04

Мы можем просто использовать np.where

np.where(df.object.isin(dict_one['A']),0,1)
Out[690]: array([1, 0, 1, 0, 1, 0])
sacul ответил: 14 июня 2018 в 11:36
@DeepakM Это лучше, чем мой ответ, и должен быть принят на мой взгляд :)

Дополнительное видео по вопросу: Создание нового двоичного столбца путем сопоставления последовательностей из словаря

32 Словари (dict) Python. Операции и методы словаря.

Уроки Python для начинающих | #10 - Словари (dict), а также их методы

11.Python для Начинающих - Словари Часть1