Как получить манекен с условием - PullRequest
0 голосов
/ 09 октября 2018

У меня есть следующая таблица:

| Name | TagID |  Key  |
|------|-------|-------|
| a    |   285 |     1 |
| a    |   101 |     0 |
| a    |   200 |     1 |
| a    |  1601 |     0 |
| a    |  1991 |     0 |
| a    |  7075 |     0 |
| b    |   285 |     1 |
| b    |   132 |     0 |
| b    |   101 |     0 |
| b    |   200 |     1 |
| b    |   165 |     0 |
| b    |  1617 |     0 |
| b    |   160 |     0 |
| b    |   334 |     1 |
| c    |   285 |     1 |
| c    |  1123 |     1 |
| c    |   200 |     0 |

Я хочу получить таблицу с формой (уникальная Names × уникальная TagID) и с 1, если TagID имеет Key =1.

Вопрос: Как это сделать наиболее эффективно?Всего у меня около 1 млн строк и 3к уникальных TagID.

Например:

|   | 101 | 132 | 160 | 165 | 200 | 285 | 334 | 1123 | 1601 | 1617 | 1991 | 7075 |
|---|-----|-----|-----|-----|-----|-----|-----|------|------|------|------|------|
| a |   0 |   0 |   0 |   0 |   1 |   1 |   0 |    0 |    0 |    0 |    0 |    0 |
| b |   0 |   0 |   0 |   0 |   1 |   1 |   1 |    0 |    0 |    0 |    0 |    0 |
| c |   0 |   0 |   0 |   0 |   0 |   1 |   0 |    1 |    0 |    0 |    0 |    0 |

1 Ответ

0 голосов
/ 09 октября 2018

Используйте pivot, замените отсутствующие значения и приведите к целым числам или set_index на unstack:

df1 = df.pivot('Name','TagID','Key').fillna(0).astype(int)
#alternative
#df1 = df.set_index(['Name','TagID'])['Key'].unstack(fill_value=0)
print (df1)
TagID  101   132   160   165   200   285   334   1123  1601  1617  1991  7075
Name                                                                         
a         0     0     0     0     1     1     0     0     0     0     0     0
b         0     0     0     0     1     1     1     0     0     0     0     0
c         0     0     0     0     0     1     0     1     0     0     0     0

РЕДАКТИРОВАТЬ: Если get:

ValueError: Индекс содержит повторяющиеся записи, не может изменить форму

, это означает, что дубликаты в Name и TagID, поэтому необходимо агрегировать max:

df2 = df.groupby(['Name','TagID'])['Key'].max().unstack(fill_value=0)
#alternative
df2 = df.pivot_table(index='Name',
                     columns='TagID',
                     values='Key',
                     fill_value=0,
                     aggfunc='max')

print (df2)
TagID  101   132   160   165   200   285   334   1123  1601  1617  1991  7075
Name                                                                         
a         0     0     0     0     1     1     0     0     0     0     0     0
b         0     0     0     0     1     1     1     0     0     0     0     0
c         0     0     0     0     0     1     0     1     0     0     0     0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...