从组合字典创建双向表

时间:2019-01-07 11:27:04

标签: python pandas dictionary

我正在编写一个简单的代码,以获取两座城市之间的双向距离表。

基本上,我有一个城市列表(仅说3个:巴黎,柏林,伦敦),我用itertools在它们之间创建了一个组合(所以我有巴黎-柏林,巴黎-伦敦,柏林-伦敦)。我解析了距网站的距离并将其保存在字典中(因此,我得到了{Paris: {Berlin : 878.36, London : 343.67}, Berlin : {London : 932.14}})。

现在,我想创建一个双向表,以便我可以在Excel中查找一对城市(不幸的是,我在Excel中需要它,否则,对于Python,这一切都是不必要的!),并且要保持距离背部。该表必须完整(即不是三角形的,以便我可以查找London-Paris或Paris-London,并且行/列对上都必须有该值)。这样的事情容易实现吗?我当时在想可能需要填写我的字典(即创建类似{ Paris : {Berlin : 878.36, London 343.67}, Berlin : {Paris : 878.36, London : 932.14}, London : {Paris : 343.67, Berlin : 932.14}的字典),然后将其提供给Pandas,但不确定这是最快的方法。谢谢!

1 个答案:

答案 0 :(得分:1)

我认为这可以满足您的需求

import pandas as pd

data = {'Paris': {'Berlin': 878.36, 'London': 343.67}, 'Berlin': {'London': 932.14}}

# Create data frame from dict
df = pd.DataFrame(data)
# Rename index
df.index.name = 'From'
# Make index into a column
df = df.reset_index()
# Turn destination columns into rows
df = df.melt(id_vars='From', var_name='To', value_name='Distance')
# Drop missing values (distance to oneself)
df = df.dropna()
# Concatenate with itself but swapping the order of cities
df = pd.concat([df, df.rename(columns={'From' : 'To', 'To': 'From'})], sort=False)
# Reset index
df = df.reset_index(drop=True)
print(df)

输出:

     From      To  Distance
0  Berlin   Paris    878.36
1  London   Paris    343.67
2  London  Berlin    932.14
3   Paris  Berlin    878.36
4   Paris  London    343.67
5  Berlin  London    932.14