基于矩阵数据帧的词典创建

2024-09-22 20:27:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用熊猫导入了以下CSV数据帧(数值为距离)

Forest,Bell Bay,Surrey Hills,Smithton,Hobart
Coupe 1,158,194,10,49
Coupe 2,156,169,71,84
Coupe 3,10,186,101,163
Coupe 4,47,94,134,139
Coupe 5,144,61,135,56
Coupe 6,27,27,134,36
Coupe 7,114,4,143,113
Coupe 8,71,170,190,140
Coupe 9,94,54,73,128
Coupe 10,46,194,92,36

通过使用以下代码

df= pd.read_csv("Example.csv", header=0, index_col="Forest")

我创建了一个我使用的森林列表:

I = df.index.tolist()

结果:

['Coupe 1', 'Coupe 2', 'Coupe 3', 'Coupe 4', 'Coupe 5', 'Coupe 6', 'Coupe 7', 'Coupe 8', 'Coupe 9', 'Coupe 10']

以及目的地J的列表,使用:

J = df.columns.values.tolist()

结果:

['Bell Bay', 'Surrey Hills', 'Smithton', 'Hobart']

元组(圆弧)列表是使用以下方法创建的:

arcs = [(i, j) for i in I for j in J]

结果:

[('Coupe 1', 'Bell Bay'), ('Coupe 1', 'Surrey Hills'), ('Coupe 1', 'Smithton'), ('Coupe 1', 'Hobart'), ('Coupe 2', 'Bell Bay'), ('Coupe 2', 'Surrey Hills'), ('Coupe 2', 'Smithton'), ('Coupe 2', 'Hobart'), ('Coupe 3', 'Bell Bay'), ('Coupe 3', 'Surrey Hills'), ('Coupe 3', 'Smithton'), ('Coupe 3', 'Hobart'), ('Coupe 4', 'Bell Bay'), ('Coupe 4', 'Surrey Hills'), ('Coupe 4', 'Smithton'), ('Coupe 4', 'Hobart'), ('Coupe 5', 'Bell Bay'), ('Coupe 5', 'Surrey Hills'), ('Coupe 5', 'Smithton'), ('Coupe 5', 'Hobart'), ('Coupe 6', 'Bell Bay'), ('Coupe 6', 'Surrey Hills'), ('Coupe 6', 'Smithton'), ('Coupe 6', 'Hobart'), ('Coupe 7', 'Bell Bay'), ('Coupe 7', 'Surrey Hills'), ('Coupe 7', 'Smithton'), ('Coupe 7', 'Hobart'), ('Coupe 8', 'Bell Bay'), ('Coupe 8', 'Surrey Hills'), ('Coupe 8', 'Smithton'), ('Coupe 8', 'Hobart'), ('Coupe 9', 'Bell Bay'), ('Coupe 9', 'Surrey Hills'), ('Coupe 9', 'Smithton'), ('Coupe 9', 'Hobart'), ('Coupe 10', 'Bell Bay'), ('Coupe 10', 'Surrey Hills'), ('Coupe 10', 'Smithton'), ('Coupe 10', 'Hobart')]

接下来,我要创建以下类型的圆弧和距离值字典:

{('Coupe 1', 'Bell Bay'): 158, ('Coupe 1', 'Surrey Hills'):194, .....}

有谁能建议制定这本词典的最佳方法吗? 这只是组合矩阵中I(10)和J(4)的一小部分。我的方法必须适用于超过1000万个I*J组合的大型数据集。 非常感谢您的帮助


Tags: csv数据方法距离df列表indexbay
3条回答

首先对MultiIndex使用^{},然后通过^{}转换为字典:

d = df.stack().to_dict()

print (d)
{('Coupe 1', 'Bell Bay'): 158, ('Coupe 1', 'Surrey Hills'): 194, ('Coupe 1', 'Smithton'): 10, ('Coupe 1', 'Hobart'): 49, ('Coupe 2', 'Bell Bay'): 156, ('Coupe 2', 'Surrey Hills'): 169, ('Coupe 2', 'Smithton'): 71, ('Coupe 2', 'Hobart'): 84, ('Coupe 3', 'Bell Bay'): 10, ('Coupe 3', 'Surrey Hills'): 186, ('Coupe 3', 'Smithton'): 101, ('Coupe 3', 'Hobart'): 163, ('Coupe 4', 'Bell Bay'): 47, ('Coupe 4', 'Surrey Hills'): 94, ('Coupe 4', 'Smithton'): 134, ('Coupe 4', 'Hobart'): 139, ('Coupe 5', 'Bell Bay'): 144, ('Coupe 5', 'Surrey Hills'): 61, ('Coupe 5', 'Smithton'): 135, ('Coupe 5', 'Hobart'): 56, ('Coupe 6', 'Bell Bay'): 27, ('Coupe 6', 'Surrey Hills'): 27, ('Coupe 6', 'Smithton'): 134, ('Coupe 6', 'Hobart'): 36, ('Coupe 7', 'Bell Bay'): 114, ('Coupe 7', 'Surrey Hills'): 4, ('Coupe 7', 'Smithton'): 143, ('Coupe 7', 'Hobart'): 113, ('Coupe 8', 'Bell Bay'): 71, ('Coupe 8', 'Surrey Hills'): 170, ('Coupe 8', 'Smithton'): 190, ('Coupe 8', 'Hobart'): 140, ('Coupe 9', 'Bell Bay'): 94, ('Coupe 9', 'Surrey Hills'): 54, ('Coupe 9', 'Smithton'): 73, ('Coupe 9', 'Hobart'): 128, ('Coupe 10', 'Bell Bay'): 46, ('Coupe 10', 'Surrey Hills'): 194, ('Coupe 10', 'Smithton'): 92, ('Coupe 10', 'Hobart'): 36}

通过使用^{}进行词典理解,您的解决方案是可行的:

I = df.index.tolist()
J = df.columns.values.tolist()

arcs = {(i, j):df.loc[i, j] for i in I for j in J}

一个建议是循环所有的元组

arcs = [(i, j) for i in I for j in J]

并使用pandas DataFrame的loc方法访问每个值

dictionary = {}
for forest_tuple in arcs:
    dictionary[(arcs[0], arcs[1])] = df.loc[arcs[0], arcs[1]]

哪一个将返回您想要的词典

不确定此方法是否适用于1000多万条条目,或者是否足够快,但您可以尝试以下方法:

dict = {}
for combination in arcs:
    dict[combination] = df.loc[combination[0], combination[1]]

print(dict)

相关问题 更多 >