我有3个值1,2,3和2个长度排列的4个字符串A,B,C,D,其中包括4个字符串中每个字符串的2个长度组合,其中总共16个元素列表。
我想从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,则col A将为1,其余为2。 如果字符串不同,例如DB或BD,则cols D和B将为3,其余为2
我只能生成列表,但我拥有的矩阵与手动完成一样好,所以不需要显示。这就是我生成列表的方式,即使我认为它甚至没有远程效率。
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']
谢谢
答案 0 :(得分:2)
构建一个数据框,用于映射索引是否包含列。
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"
"BB
或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