Создание нового столбца для каждого потенциального значения в столбце, чтобы создать массив истинности, соответствующий значению строки - PullRequest
0 голосов
/ 03 марта 2020

У меня есть набор данных в этом общем формате:

group_id   item_id  zone   time 
       1         1     1      1
       1         3     4      1
       2         6     3      1
       2         2     4      1
       3         1     1      1
       1         2     3      2
       1         6     2      2
       2         8     1      2
       2         5     2      2
       3         1     1      2

Я хочу создать новый столбец для каждого потенциального значения в столбце зоны, а затем назначить ему значение истинности, если оно представляет эту строку. Скажем, было четыре потенциальных зоны, перечисленных в names = ['zone_1', 'zone_2', 'zone_3', 'zone_4']. Вывод должен выглядеть примерно так:

group_id   item_id  time  zone_1  zone_2  zone_3  zone_4
       1         1     1       1       0       0       0
       1         3     1       0       0       0       1
       2         6     1       0       0       1       0
       2         2     1       0       0       0       1
       3         1     1       1       0       0       0      
       1         2     2       0       0       1       0
       1         6     2       0       1       0       0
       2         8     2       1       0       0       0
       2         5     2       0       1       0       0
       3         1     2       1       0       0       0

Я не уверен, как лучше всего этого добиться. Я могу создать новые столбцы прямо из списка имен. Я мог бы создать массив для зоны (например, значение зоны 3 заменить на [0,0,1,0]), затем pd.explode для 'zone' с последующим поворотом, но замена строка за строкой интенсивна и не очень pandas -подобный. Я ценю любые другие предложения.

Может быть важно отметить, что group_id + item_id + time создают уникальный элемент (нет двух одинаковых элементов на всех трех значениях).

Спасибо Вы!

РЕДАКТИРОВАТЬ: Чтобы уточнить, как мне было неясно: может быть больше потенциальных зон, чем уникально появляется в столбце. Например, вышеуказанный набор данных может быть связан с names = ['zone_1', 'zone_2', 'zone_3', 'zone_4', 'zone_5]. Хотя нет ни одного случая, когда зона 5 появляется в кадре данных, ему также нужен новый столбец. В идеале решение также создает для этого столбец (для более поздних целей визуализации). Выход в этом случае будет:

group_id   item_id  time  zone_1  zone_2  zone_3  zone_4  zone_5
       1         1     1       1       0       0       0       0
       1         3     1       0       0       0       1       0
       2         6     1       0       0       1       0       0
       2         2     1       0       0       0       1       0
       3         1     1       1       0       0       0       0
       1         2     2       0       0       1       0       0
       1         6     2       0       1       0       0       0
       2         8     2       1       0       0       0       0
       2         5     2       0       1       0       0       0
       3         1     2       1       0       0       0       0

Ответы [ 2 ]

1 голос
/ 03 марта 2020

IIU C, используя pandas.get_dummies:

zones = df.pop("zone")
new_df = pd.concat([df, pd.get_dummies(zones, prefix="zone")], 1)
print(new_df)

Выход:

   group_id  item_id  time  zone_1  zone_2  zone_3  zone_4
0         1        1     1       1       0       0       0
1         1        3     1       0       0       0       1
2         2        6     1       0       0       1       0
3         2        2     1       0       0       0       1
4         3        1     1       1       0       0       0
5         1        2     2       0       0       1       0
6         1        6     2       0       1       0       0
7         2        8     2       1       0       0       0
8         2        5     2       0       1       0       0
9         3        1     2       1       0       0       0
1 голос
/ 03 марта 2020

Давайте сделаем crosstab

df=df.join(pd.crosstab(df.index,df.zone).add_prefix('zone_'))
df
   group_id  item_id  zone  time  zone_1  zone_2  zone_3  zone_4
0         1        1     1     1       1       0       0       0
1         1        3     4     1       0       0       0       1
2         2        6     3     1       0       0       1       0
3         2        2     4     1       0       0       0       1
4         3        1     1     1       1       0       0       0
5         1        2     3     2       0       0       1       0
6         1        6     2     2       0       1       0       0
7         2        8     1     2       1       0       0       0
8         2        5     2     2       0       1       0       0
9         3        1     1     2       1       0       0       0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...