Поиск в словаре Python с несколькими значениями - PullRequest
0 голосов
/ 06 июля 2018

У меня есть данные в следующем CSV-файле, доступном здесь:

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

Скриншот CSV:

enter image description here

Я написал следующий код для импорта CSV-файла в Python как Pandas Dataframe, а затем после кода создаю словарь 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)

Теперь я хотел бы написать функцию, которая позволит мне осуществлять поиск в словаре.

Например, пользователь вводит «32» для vCPU, функция возвращает цены региона, имени и Linux и Windows для любых процессоров, имеющих 32 vCPU.

Позже я хочу реализовать эту функцию поиска для vCPU, памяти и хранилища. (полный CSV имеет 1700 строк). Буду очень признателен, если кто-то поможет мне.

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Вы собираетесь перезаписать все данные, если у вас есть несколько значений для ключа.

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.

0 голосов
/ 06 июля 2018

Почему бы просто не выполнить поиск по фрейму данных? Ваш код запроса может обобщать следующее.

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», конвертировать в значения, перебирать совпадающие значения и т. Д. У вас есть несколько вариантов использования, поэтому я надеюсь, что этот код даст вам основу для сборки на. Для получения ближайших совпадений см. Ответы на этот вопрос .

# 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'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...