Python создает комбинации идентификаторов на основе условий - PullRequest
0 голосов
/ 25 февраля 2019

Привет, я хотел бы создать комбинации идентификаторов.Я знаю, как создавать все возможные комбинации, но я застрял в одной заключительной части операции.Любая помощь будет принята с благодарностью.

У меня есть следующий набор данных:

импорт панд в виде pd из itertools import комбинации_with_replacement

d1 = {'Subject': ['Subject1','Subject1','Subject1','Subject2','Subject2','Subject2','Subject3','Subject3','Subject3','Subject4','Subject4','Subject4','Subject5','Subject5','Subject5'],
'Actual':['1','0','0','0','0','1','0','1','0','0','0','0','1','0','1'],
'Event':['1','2','3','1','2','3','1','2','3','1','2','3','1','2','3'],
'Category':['1','1','2','1','1','2','2','2','2','1','1','1','1','2','1'],
'Variable1':['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15'],
'Variable2':['12','11','10','9','8','7','6','5','4','3','2','1','-1','-2','-3'],
'Variable3': ['-6','-5','-4','-3','-4','-3','-2','-1','0','1','2','3','4','5','6']}
d1 = pd.DataFrame(d1)

Я хочу создать все возможные комбинациипредметов в каждом событии в каждом уровне.Это делается с помощью (из предыдущего вопроса Форма группы лиц Python (pandas) ):

L = [(i[0], i[1], y[0], y[1]) for i, x in d1.groupby(['Event','Category'])['Subject'] 
                          for y in list(combinations_with_replacement(x, 2))]
df = pd.DataFrame(L, columns=['Event','Category','Subject_IDcol1','Subject_IDcol2'])

Теперь я хочу взять все те пары, для которых Actual = 1 ислучайным образом выберите «n» Предметы, для которых Actual = 0. Здесь для простоты, давайте возьмем n = 1. Я хочу запустить функцию комбинаций_в_место в этом новом списке.

Вывод, который янапример, хотите получить (при условии случайного выбора):

Для события 1 категории 1: субъекты 1 и 5 имеют Actual = 1 и предположим, что субъект 2 выбран случайным образом.

enter image description here

По сравнению с этим в предыдущем случае результат был примерно таким (для события = 1 и категории = 1)

enter image description here

Любая помощь будет оценена.Спасибо.

1 Ответ

0 голосов
/ 25 февраля 2019

Я думаю, что это один из способов сделать то, что вы хотите:

import itertools
import pandas as pd
import numpy as np

d1 = {
    'Subject': ['Subject1', 'Subject1', 'Subject1', 'Subject2', 'Subject2', 'Subject2',
                'Subject3', 'Subject3', 'Subject3', 'Subject4', 'Subject4', 'Subject4',
                'Subject5', 'Subject5', 'Subject5'],
    'Actual': ['1', '0', '0', '0', '0', '1', '0', '1', '0', '0', '0', '0', '1', '0', '1'],
    'Event': ['1', '2', '3', '1', '2', '3', '1', '2', '3', '1', '2', '3', '1', '2', '3'],
    'Category': ['1', '1', '2', '1', '1', '2', '2', '2', '2', '1', '1', '1', '1', '2', '1'],
    'Variable1': ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15'],
    'Variable2': ['12', '11', '10', '9', '8', '7', '6', '5', '4', '3', '2', '1', '-1', '-2', '-3'],
    'Variable3': ['-6', '-5', '-4', '-3', '-4', '-3', '-2', '-1', '0', '1', '2', '3', '4', '5', '6']
}
d1 = pd.DataFrame(d1)
num_nonactual = 1

np.random.seed(100)
# First leave only up to num_nonactual subjects with actual != '1' for each event/category
g1 = d1.groupby(['Event', 'Category', 'Actual'], group_keys=False)
d2 = g1.apply(lambda x: x if x.name[2] == '1' else x.sample(min(num_nonactual, len(x))))
# Then do the same as before
d2.sort_values('Subject', inplace=True)
L = [(i1, i2, y1, y2)
     for (i1, i2), x in d2.groupby(['Event', 'Category'])['Subject']
     for y1, y2 in itertools.combinations_with_replacement(x, 2)]
df = pd.DataFrame(L, columns=['Event', 'Category', 'Subject_IDcol1', 'Subject_IDcol2'])
print(df)

Вывод:

   Event Category Subject_IDcol1 Subject_IDcol2
0      1        1       Subject1       Subject1
1      1        1       Subject1       Subject4
2      1        1       Subject1       Subject5
3      1        1       Subject4       Subject4
4      1        1       Subject4       Subject5
5      1        1       Subject5       Subject5
6      1        2       Subject3       Subject3
7      2        1       Subject2       Subject2
8      2        2       Subject3       Subject3
9      2        2       Subject3       Subject5
10     2        2       Subject5       Subject5
11     3        1       Subject4       Subject4
12     3        1       Subject4       Subject5
13     3        1       Subject5       Subject5
14     3        2       Subject2       Subject2
15     3        2       Subject2       Subject3
16     3        2       Subject3       Subject3
...