Python создает матрицу и выбирает строки в зависимости от значений списка - PullRequest
0 голосов
/ 18 мая 2018

У меня есть 3 значения 1, 2, 3 и 2 перестановки длины из 4 строк A, B, C, D, в которые я включил комбинацию из 2 длин каждой из 4 строк с самим собой для всего 16 элементов вlist.

Я хочу создать матрицу из 3 значений, чтобы каждый из 16 элементов был связан со строкой в ​​матрице.Строки и показанные заголовки не являются частью матрицы.Просто выберите строки, если встречается связанная строка?Как создать матрицу?

Пример:

        A       B       C       D
"AA"    1       2       2       2
"BB"    2       1       2       2 
"CC"    2       2       1       2 
"DD"    2       2       2       1 
"AD"    3       2       2       3 
"AB"    3       3       2       2 
"CB"    2       3       3       2
"BC"    2       3       3       2

и т. Д.Это шаблон 16 раз.т. е. если строка имеет то же значение, например, AA, столбец A будет равен 1, а остальные будут равны 2. Если строка отличается, например, DB или BD, столбцы D и B будут равны 3, а остальные - 2

Iмог только сгенерировать список, но матрица, которую я имею, так же хороша, как делать это вручную, поэтому даже показывать не нужно.Вот как я сгенерировал список, хотя я думаю, что он даже отдаленно не эффективен.

import itertools

a = list(itertools.permutations('ABCD0', 2)) #added 0 in order to get 2 repetitions of 1 or 2 or 3 or 4
b =[]
for i in a:
    if i[0] == "0":
        change = i[1]
        c = (change,) + i[1:]
        b.append(c)
d = a + b
e = [(i) for i in d if "0" not in i]
f = [list(elem) for elem in e]
g=[]
for i in f:
       g.append( (''.join([w+' ' for w in i])).strip())
h = [elem for elem in g if elem.strip()]
j = [e.replace(" ","") for e in h]
print(j)

J - это список

['AB', 'AC', 'AD', 'BA', 'BC', 'BD', 'CA', 'CB', 'CD', 'DA', 'DB', 'DC', 'AA', 'BB', 'CC', 'DD']

Спасибо

1 Ответ

0 голосов
/ 18 мая 2018

Создайте фрейм данных, который отображает, содержат ли ваши индексы ваши столбцы или нет.

df = pd.DataFrame({}, columns=list('ABCD'), index=j)

Вы можете сделать это, используя str.contains

map_df = pd.DataFrame([df.index.str.contains(x) for x in df.columns],
                      columns=j, 
                      index=list('ABCD')).T

Это создаст фрейм данных, где ячейки равны True, если есть совпадение между столбцами и строками (например,, строка "AB" и столбцы "A" и "B") и False в противном случае

    A       B       C       D
AB  True    True    False   False
AC  True    False   True    False
AD  True    False   False   True
BA  True    True    False   False
BC  False   True    True    False
BD  False   True    False   True
CA  True    False   True    False
CB  False   True    True    False
CD  False   False   True    True
DA  True    False   False   True
DB  False   True    False   True
DC  False   False   True    True
AA  True    False   False   False
BB  False   True    False   False
CC  False   False   True    False
DD  False   False   False   True

Теперь вы можете проверить, какие строки состоят из одинаковых дублированных символов (например, "AA" или * 1017).*) используя regular expressions

>>> r = df.index.str.match(r"(\w)\1{1,}")
array([False, False, False, False, False, False, False, False, False,
       False, False, False,  True,  True,  True,  True])

И используя операторы ~ и .iloc, вы можете использовать applymap для определения вашей логики для определенных наборов строк

map_df.iloc[~r, :] = map_df.iloc[~r,:].applymap(lambda k: 3 if k else 2)
map_df.iloc[r, :]  = map_df.iloc[r,:].applymap(lambda k: 1 if k else 2)

    A   B   C   D
AB  3   3   2   2
AC  3   2   3   2
AD  3   2   2   3
BA  3   3   2   2
BC  2   3   3   2
BD  2   3   2   3
CA  3   2   3   2
CB  2   3   3   2
CD  2   2   3   3
DA  3   2   2   3
DB  2   3   2   3
DC  2   2   3   3
AA  1   2   2   2
BB  2   1   2   2
CC  2   2   1   2
DD  2   2   2   1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...