Python: двоичный вектор - PullRequest
       0

Python: двоичный вектор

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

У меня есть набор индексов:

indices = (['1', '1.2', '2', '2.2', '3', '4'])

и набор данных, где первый элемент идентифицирует человека, второй раунд, а третий - индекс из набора индексов:

dataset = [['A', '1', '1'], ['A', '1', '1.2'], ['B', '1', '2'], ['C', '2', '3']]

Я хотел бы сформировать бинарный вектор, где для каждого человека и для каждого отдельного раунда индексы помечаются либо присутствующими (с 1), либо нет (с 0).

Желаемый результат будет примерно таким: где для A вектор представляет наличие индексов 1 и 1.2, для B - индекс 2, а для C - индекс 3. Обратите внимание, что для A существует только одна запись, но присутствуют 2 индекса.

['A', '1', '1, 1, 0, 0, 0, 0']
['B', '1', '0, 0, 1, 0, 0, 0']
['C', '2', '0, 0, 0, 0, 1, 0']

У меня возникли некоторые проблемы, связанные с циклом обработки индексов по набору данных.Моя идея состояла в том, чтобы циклически проходить через индексы, установленные столько же времени, сколько и количество списков в наборе данных.Но я не думаю, что это самый эффективный способ, и любая помощь будет признательна!

Ответы [ 2 ]

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

Вот решение без петель

import pandas as pd
indlist=['1', '1.2', '2', '2.2', '3', '4']
dataset = [['A', '1', '1'], ['A', '1', '1.2'], ['B', '1', '2'], ['C', '2', '3']]
df=pd.DataFrame(dataset,columns=['player','round','ind']).set_index('ind').reindex(indlist)
ans=df.reset_index().pivot('player','ind','round').fillna(0)[1:]
0 голосов
/ 10 декабря 2018

Я бы сделал это примерно так:

from itertools import groupby

for k, g in groupby(dataset, lambda x: x[:2]):
    vals = [x[2] for x in g]
    print(k + [", ".join("1" if x in vals else "0" for x in indices)])

Вывод

['A', '1', '1, 1, 0, 0, 0, 0']
['B', '1', '0, 0, 1, 0, 0, 0']
['C', '2', '0, 0, 0, 0, 1, 0']

Это то, что вы искали?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...