我有一个字典(在python中),其中键是动物名称,值是包含基因名称的集合。并非所有动物都拥有所有基因。 大约有108个基因(我有一个列表)和15个种类。所有动物共有28种基因。
我想在动物中为每种动物和基因绘制一个基因的存在。 例如:
d = {'dog': {'tnfa', 'tlr1'}, 'cat': {'myd88', 'tnfa', 'map2k2'}}
我想要的情节看起来像这样:
dog cat
tnfa x x
myd88 x
tlr1 x
map2k2 x
如果我能将具有最多基因的动物分组在一起,那将是很好的。但这是可选的。
您对我可以采取的方法有什么建议吗?
答案 0 :(得分:1)
使用pandas crosstab
将获得您正在寻找的矩阵
d = {'dog': ['tnfa', 'tlr1'], 'cat': ['myd88', 'tnfa']}
#data munging
df = pd.DataFrame(d).stack()
df.index = df.index.droplevel(0)
#create and format crosstab
ct = pd.crosstab(df.index, df.values)
ct.index.name = "animal"
ct.columns.name= "gene"
ct = ct.replace([0, 1], ["" , "x"])
ct = ct.T
print(ct)
结果
animal cat dog
gene
myd88 x
tlr1 x
tnfa x x
不确定分组 - 您的意思是基因数量还是常见基因?可能还需要一些更多的例子。
答案 1 :(得分:1)
我们试试这个:
axios({
method: 'post',
url: '/graphql',
// payload is the payload above
data: payload,
});
输出:
d = {'dog': {'tnfa', 'tlr1'}, 'cat': {'myd88', 'tnfa'}}
df = pd.DataFrame.from_dict(d, orient='index')
df.stack().reset_index()\
.drop('level_1',axis=1).assign(Value='x')\
.set_index([0,'level_0'])['Value']\
.unstack().rename_axis('gene')\
.rename_axis('animal', 1)
答案 2 :(得分:1)
我的解决方案只使用一些简单的pandas
和for-loops
方法来打印整齐的表格,而不是使用.ljust
。
我不太习惯在dictionaries
中使用python
,但使用.keys()
似乎还有很长的路要走。代码loops
通过每只动物获得动物的基因。然后对于表中到目前为止的每一行,如果该行的第一个值在基因中,那么只需在该行的末尾添加'x'
以标记该动物具有该基因,同时删除该基因所以它最后没有创建自己的行。否则,如果该行的第一个元素不是动物的基因之一,那么只需附加一个空字符串来填充表格中的那个单元格。
最后,对于所有剩余的基因,如果它们尚未从表中删除,则在表格中创建一个新的row
,其中包含以下细胞:该基因,之前已见过的动物数量( ['']*index
)然后最后是' x'表明当前的动物确实有那个基因。
最后,最后一步是在开头插入一行,只是从dict
获得动物名称。
以下是代码:
d = {'dog': {'tnfa', 'tlr1'}, 'cat': {'myd88', 'tnfa', 'map2k2'}}
table = []
cellWidth = 0
for index, animal in enumerate(d.keys()):
cellWidth = max(cellWidth, len(animal))
genes = d[animal]
for row in table:
if row[0] in genes:
row.append('x')
genes.remove(row[0])
else:
row.append('')
for gene in genes:
cellWidth = max(cellWidth, len(gene))
table.append([gene] + ['']*index + ['x'])
table.insert(0, [''] + list(d.keys()))
[print(''.join([c.ljust(cellWidth + 1) for c in r])) for r in table]
结果是想要的:
cat dog
map2k2 x
tnfa x x
myd88 x
tlr1 x
我添加了variable
:cellWidth
,它将存储最长的动物或基因。为此,使用max()
函数来最小化代码长度。在最后的print
中,单元格打印的空格比max
多一个,因此有一些空间。