我想用Panda读取一个excel表,并创建一个元组列表。然后,我想将列表转换成以元组为键的字典。我该怎么办?
这是我正在阅读的桌子;
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}
答案 0 :(得分:2)
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']))
答案 1 :(得分:0)
Jan-这是一个主意:只需使用pandas apply函数创建一个关键列,以生成前两列的元组,然后将其压缩成字典即可。
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}
答案 2 :(得分:0)
这不如@Vaishali的答案简洁,但可以使您更多地了解这些步骤。
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'}
答案 3 :(得分:0)
如果您使用简单的代码:
此人不会使用任何类似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'}
答案 4 :(得分:0)
对于较小的框架,理解将很有效:
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)])