我有 3 个值 1,2,3 和 4 个字符串 A、B、C、D 的 2 长度排列,其中我包含了 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,则 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']
谢谢
最佳答案
构建一个数据框架来映射您的索引是否包含您的列。
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
如果列和行之间存在匹配(例如,行 "AB"
和列 ",这将创建一个数据框,其中单元格为
和 True
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
)
>>> 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
关于Python 创建矩阵并根据列表值选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50417671/