好的,我以前读过所有这些,我认为大熊猫可能是一个解决方案,但我的问题略有不同:
Print a dictionary of lists vertically
Printing Lists as Tabular Data
print dictionary values which are inside a list in python
Print a dictionary into a table
我有一份清单:
dict={"A":[i1, i2,i3], "B":[i1, i4,i5], "C":[i1, i2,i5]}
我想要的输出是:
i1 i2 i3 i4 i5
A x x x - -
B x - - x x
C x x - - x
(甚至更好,
i1 i2 i3 i4 i5
A A A A - -
B B - - B B
C C C - - C
或与另一个字典中的A,B,C或(A,in)匹配的值, 但如果我只能拥有第一张桌子,我会非常高兴)
没有列表包含重复,但这些列表中的每个元素都是从同一个列表中提取的(实际上我的问题是使用相应的蛋白质制作带注释的术语网格,关键是带注释的术语,这些是与这些蛋白质相关的功能在我的研究中)。
我确实可以想到一种复杂的方法(建立0和1的向量,用于将每个列表与一般列表进行比较,将这些向量与键相关联,将其放入一个pandas DataFrame中,该格式将由我的魔力重建了每个列表中的大量实体,并打印出来),但这看起来很乏味/单调。
我认为必须有一种已知的方法来做一些模块(熊猫,漂亮,其他?);我只是不知道。 因此,我很高兴有任何见解。感谢
答案 0 :(得分:5)
apply
的 lambda
d = {
"A": ['i1', 'i2', 'i3'],
"B": ['i1', 'i4', 'i5'],
"C": ['i1', 'i2', 'i5']
}
df = pd.DataFrame(d)
df.apply(lambda c: pd.Series(c.name, c.values)).fillna('-').T
i1 i2 i3 i4 i5
A A A A - -
B B - - B B
C C C - - C
答案 1 :(得分:1)
只是一个简单的草稿(基于很多str.format
):
def create_table(dictionary, columns):
column_set = set(columns) # only to speed up "in" calls, could be omitted
# Fill in the symbols depending on the presence of the corresponding columns
filled_dct = {key: [' X' if col in lst else ' -' for col in column_set]
for key, lst in dct.items()}
# A template string that is filled for each row
row_template = ' '.join(['{}']*(len(columns)+1))
print(row_template.format(*([' '] + columns)))
for rowname, rowcontent in sorted(filled_dct.items()):
print(row_template.format(*([rowname] + rowcontent)))
dct = {"A": ['i1', 'i2', 'i3'],
"B": ['i1', 'i4', 'i5'],
"C": ['i1', 'i2', 'i5']}
columns = ['i1', 'i2', 'i3', 'i4', 'i5']
create_table(dct, columns)
i1 i2 i3 i4 i5
A X X - - X
B X - X X -
C X X X - -
虽然它不是很灵活(可变列宽等),但应该很容易扩展。
答案 2 :(得分:1)
考虑你的输入字典:
dic = {"A":["i1", "i2", "i3"], "B":["i1", "i4", "i5"], "C":["i1", "i2", "i5"]}
使用dict.fromkeys()
,以便迭代变为dic
(又名dic.values()
)内的值list
,其默认值为{{1} } key(又名dic's
)。
在字典理解的帮助下,在最后一步计算的结果将构成数据帧的值。转置它以使列标题成为索引轴,反之亦然。
稍后,按dic.keys()
填写Nans
。
"-"