gpt4 book ai didi

Python 创建矩阵并根据列表值选择行

转载 作者:太空宇宙 更新时间:2023-11-04 02:25:56 26 4
gpt4 key购买 nike

我有 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

现在,您可以使用 正则表达式

>>> 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com