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

时间:2018-05-18 18:54:35

标签: python pandas

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

谢谢

1 个答案:

答案 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"

检查哪些行包含相同的字符重复项(例如"BBregular 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