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

标签 python pandas

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

相关文章:

python - Pandas ParserError : Error tokenizing data. C 错误:字符串内的 EOF

python - 获取 pandas 中分类变量的映射

python - 将 Python Dataframe 写入具有特定格式的 Word/Excel 文档

python - 如何查看账户是否已保存?

python - python中的子进程远程命令执行

python - 音频信号在字级边界处分离

python - Django 500 内部服务器错误 - 配置不当 : Error loading MySQLdb module:

python - 从文件中提取所有日期时间戳(修改、创建、EXIF 日期等)

Pandas 根据日期范围爆炸列

python - 删除 Pandas Dataframe 中的重复日期并合并值 - Python