搜索具有多个值的Python字典

时间:2018-07-05 23:05:57

标签: python pandas dictionary dataframe search

我在以下CSV文件中有数据,可在此处获取:

http://s000.tinyupload.com/index.php?file_id=87473936848618674050

CSV的屏幕截图:

enter image description here

我编写了以下代码,将CSV文件作为Pandas数据框导入到Python中,然后,此后的代码创建了字典dict。字典必须以名称和区域作为键,而Windows和Linux价格作为字典值。

#Import libraries and CSV file into dataframe, renaming columns, printing head

import pandas as pd

df = pd.read_csv('file.csv')

col_names = ['Name','Region','API', 'Memory','vCPU', 'Storage', 'Linux', 'Windows' ]

df.columns = col_names

#Creating Dict
dict = {}

for i in df.index:

    key = (df.at[i, 'Name'] , df.at[i, 'Region'])
    value = (df.at[i, 'vCPU'], df.at[i, 'Memory'], df.at[i, 'Storage'], df.at[i, 'Windows'] , df.at[i, 'Linux'])

    dictionary = {key:value}
    dict.update(dictionary)

我现在想编写一个函数,使我可以搜索字典。

例如,用户将为vCPU输入“ 32”,该功能将带回具有32个vCPU的任何处理器的区域,名称以及Linux和Windows的价格。

稍后,我想为vCPU,内存和存储实现此搜索功能。 (完整的CSV包含1700行)。非常感谢有人帮助我。

2 个答案:

答案 0 :(得分:1)

为什么不只是搜索数据框?您的查询代码可以概括以下内容。

for index, row in df.loc[df['vCPU'] == '32 vCPUs'].iterrows():
    print (row['Region'] + ', ' + row['Name'] + ', Linux price: '+ row['Linux'] + ', Windows price: '+ row['Windows'])

输出:

US West - NorCal, Cluster Compute Eight Extra Large, Linux price: unavailable, Windows price: unavailable
US East - Ohio, I2 Eight Extra Large, Linux price: $6.820000 hourly, Windows price: $7.782000 hourly
APAC - Singapore, I3 High I/O Eight Extra Large, Linux price: $2.992000 hourly, Windows price: $4.464000 hourly

这里有更多代码可以回答您的后续评论。上面,我展示了如何在数据框中查找数据。这里还有更多代码,我希望可以充分演示如何剥离标签(如“ GiB”),转换为值,对匹配值进行迭代等。您有几个用例,所以我希望该代码为您提供构建基础上。要获取最接近的匹配项,请参见this question的答案。

# strip out the "GiB" and convert to float values
df['Memory'] = df['Memory'].str.split(' ').str[0].astype(float)

# use whatever code you need to get input from user
cpu_request = '2 vCPUs'
mem_request = 3

matches = df.loc[(df['vCPU'] == cpu_request)]
if matches.empty == 'True':
    print ('No matches.')
else:
    for index, row in matches.loc[(matches['Memory'] >= mem_request)].iterrows():
        print(row['Name'] + ':')
        # you could add another loop here if your data can have multiple entries per name.
        print ('\t' + row['Region'] + ', ' + str(row['Memory']) + ' GiB, Linux price: '+ row['Linux'] + ', Windows price: '+ row['Windows'])

答案 1 :(得分:0)

如果密钥有多个值,则将覆盖所有数据。

In [4]: d = {}

In [5]: d.update({1:1})

In [6]: d.update({1:2})

In [7]: d
Out[7]: {1: 2}

您将必须创建一个dict,并将其键映射到值列表

for i in df.index:
    key = (df.at[i, 'Name'] , df.at[i, 'Region'])
    value = (df.at[i, 'vCPU'], df.at[i, 'Memory'], df.at[i, 'Storage'], df.at[i, 'Windows'] , df.at[i, 'Linux'])

    if key in dict:
        dict[key].append(value)
    else:
        dict[key] = [value]

但是所有这些都是多余的。您应该使用DataFrame