Как преобразовать список в словарь, который использует кортеж в качестве ключа - PullRequest
0 голосов
/ 14 января 2019

Я бы хотел прочитать таблицу Excel с помощью Panda и создать список кортежей. Затем я хочу преобразовать список в словарь, в котором ключом является кортеж. Как я могу это сделать?

Вот таблица, которую я читаю;

A B 0.6

A C 0.7

C D 1.0

C A 1.2

D B 0.7

D C 0.6

Вот как я читаю свою таблицу;

import pandas as pd

df= pd.read_csv("my_file_name.csv", header= None)  

my_tuple = [tuple(x) for x in df.values]

Теперь я хочу иметь следующую структуру.

my_data =  {("A", "B"): 0.6,

            ("A", "C"): 0.7,

            ("C", "D"): 1,

            ("C", "A"): 1.2,

            ("D", "B"): 0.7,

            ("D", "C"): 0.6}

Ответы [ 5 ]

0 голосов
/ 14 января 2019

Понимание будет хорошо работать для меньших кадров:

dict((tuple((a, b)), c) for a,b,c in df.values)
#{('A', 'B'): 0.6,
# ('A', 'C'): 0.7,
# ('C', 'A'): 1.2,
# ('C', 'D'): 1.0,
# ('D', 'B'): 0.7,
# ('D', 'C'): 0.6}

Если возникают проблемы с заказом:

from collections import OrderedDict

d = OrderedDict((tuple((a, b)), c) for a,b,c in df.values)
#OrderedDict([(('A', 'B'), 0.6),
#             (('A', 'C'), 0.7),
#             (('C', 'D'), 1.0),
#             (('C', 'A'), 1.2),
#             (('D', 'B'), 0.7),
#             (('D', 'C'), 0.6)])
0 голосов
/ 14 января 2019

Если вы используете простой код:

этот не будет использовать какой-либо импорт вроде panda:

def change_csv(filename):
    file_pointer = open(filename, 'r')
    data = file_pointer.readlines()
    dict = {}
    file_pointer.close()
    for each_line in data:
        a, b, c =  each_line.strip().split(" ")
        dict[a, b] = c
    return dict

так что не думай об этом.

и вывод:

{('A', 'B'): '0.6', ('A', 'C'): '0.7', ('C', 'D'): '1.0', ('C', 'A'): '1.2', ('D', 'B'): '0.7', ('D', 'C'): '0.6'}
0 голосов
/ 14 января 2019

Set_index и to_dict

df.set_index(['a', 'b']).c.to_dict()

{('A', 'B'): 0.6,
 ('A', 'C'): 0.7,
 ('C', 'A'): 1.2,
 ('C', 'D'): 1.0,
 ('D', 'B'): 0.7,
 ('D', 'C'): 0.6}

Вариант 2: еще одно решение с использованием zip

dict(zip(df[['A', 'B']].apply(tuple, 1), df['C']))

Вариант 3:

k = df[['A', 'B']].to_records(index=False).tolist()
dict(zip(k, df['C']))
0 голосов
/ 14 января 2019

Это менее лаконично, чем ответ @ Вайшали, но дает вам более полное представление о шагах.

vals1 = df['A'].values
vals2 = df['B'].values
vals3 = df['C'].values

dd = {}
for i in range(len(vals1)):
    key = (vals1[i], vals2[i])
    value = vals3[i]
    dd[key] = value

{('A', 'B'): '0.6',
('A', 'C'): '0.7',
('C', 'D'): '1.0',
('C', 'A'): '1.2',
('D', 'B'): '0.7',
('D', 'C'): '0.6'}
0 голосов
/ 14 января 2019

Январь - вот одна из идей: просто создайте ключевой столбец, используя функцию применения pandas, чтобы сгенерировать кортеж из первых двух столбцов, а затем сжать их до нужного значения.

import pandas as pd
df = pd.read_clipboard()
df.columns = ['first', 'second', 'value']
df.head()

def create_key(row):
    return (row['first'], row['second'])

df['key'] = df.apply(create_key, axis=1)

dict(zip(df['key'], df['value']))

{('A', 'C'): 0.7,
 ('C', 'A'): 1.2,
 ('C', 'D'): 1.0,
 ('D', 'B'): 0.7,
 ('D', 'C'): 0.6}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...