2017-02-22 39 views
4

Ok, я прочитал все это раньше, и я думаю, что панды может быть решением, но моя проблема slighly разные:
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 списков в качестве сетки-макета

у меня есть Dict списков:

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 или (А, В) в другом словаре, но если я могу просто иметь первую таблицу, я будет более чем счастлив)

В списке нет повторов, но все элементы из этих списков извлекаются из одного и того же списка (на самом деле моя проблема заключается в создании сетки аннотированных терминов с соответствующими белками, ключи - аннотированные термины , которые являются функциями, связанными с этими белками в моем ext исследования).

Я действительно могу представить себе сложный способ сделать это (строить векторы 0 и 1 для сравнения каждого списка с общим списком, связывая эти векторы с ключами, помещая это в панд DataFrame, который будет хорошо отформатирован по волшебству меня, восстанавливая большое количество сущностей в списке, и печатайте это), но это кажется/утомительным/нерепичным.

Я думаю, что должен быть известный способ сделать это с помощью некоторого модуля (панды, симпатичные, другие?); и что я просто этого не знаю. Так что я буду рад за любое понимание этого. Благодаря

ответ

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 
+0

Высокий. Благодарю. Я думаю, меня всегда беспокоит то, как pandas конвертирует списки в dicts в столбцы. Если я хорошо понимаю, мне просто нужно получить c.values ​​вместо c.name, чтобы иметь значение вместо этого? Замечательно. –

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

Это не очень гибкая (переменная ширина колонки и т.д.), но, хотя должен быть легко расширяемым.

+0

Спасибо за ответ. это то, о чем я подумал о «запутанных путях» (по общему признанию, он не так сильно запутан, как я бы мог подумать, но на самом деле это не путинский способ делать то, что я хотел. Я буду поддерживать вас за усилия) –

1

Рассмотрим вашего входной словаря:

dic = {"A":["i1", "i2", "i3"], "B":["i1", "i4", "i5"], "C":["i1", "i2", "i5"]} 

Используйте dict.fromkeys() так, что итератор становится значение, присутствующего в dic (a.k.a dic.values()), который является list, и это значение по умолчанию будет вполне dic's ключ (a.k.a dic.keys()).

С помощью словарного знака результат, вычисляемый на последнем шаге, будет представлять собой значения блока данных. Транспортируйте его так, чтобы заголовки столбцов становились осью индекса и наоборот.

Позже заполните Nans от "-".

pd.DataFrame({k:dict.fromkeys(v,k) for k,v in dic.items()}).T.fillna("-") 
#        ^----- replace k with "x" to get back the first o/p 

enter image description here

+0

Nice ответ тоже, очень питонический и умный. Я не буду выбирать его как принятый ответ, потому что процесс создания dict of dicts немного сложнее для концептуального управления. Но я сохраняю мастерское использование этого, чтобы сказать пандам, что делать с колонками и строками ... –