2014-10-24 2 views
0

У меня есть CSV-файл, который при открытии в Excel выглядит следующим образом: enter image description hereНайти максимальное число в CSV-файл в Python

Мой код:

myfile = open("/Users/it/Desktop/Python/In-Class Programs/countries.csv", "rb") 

    countries = [] 
    for item in myfile: 
     a = item.split(",") 
     countries.append(a) 

    hdi_list = [] 
    for acountry in countries: 
     hdi = acountry[3] 

     try: 
      hdi_list.append(float(hdi)) 
     except: 
      pass 

    average = round(sum(hdi_list)/len(hdi_list), 2) 
    maxNumber = round(max(hdi_list), 2) 
    minNumber = round(min(hdi_list), 2) 

Этот код работает хорошо, однако, когда я нахожу max, min или avg, мне нужно захватить соответствующее имя страны и напечатать это.

Как я могу изменить свой код, чтобы захватить название страны min, max, avg?

+0

Возможно, используйте словарь вместо списка? Укажите страны как ключи и ценности как ценности? Затем найдите ключ для самого высокого значения? – ArtOfWarfare

+0

Это текстовый файл, почему бы не открыть его в текстовом режиме '... 'rt')' – Yetti99

+1

Вы уверены, что этот код работает?В названиях стран есть запятые, в этом случае должно быть дополнительное поле, а значения - одно поле. –

ответ

1

Следующий подход достаточно близок к вашей реализации, и я думаю, что это может быть полезно. Однако, если вы начнете работать с более крупными или более сложными файлами csv, вы должны изучить пакеты, такие как «csv.reader» или «Pandas» (как упоминалось ранее). Они более надежны и эффективны при работе со сложными данными .csv. Вы также можете работать через Excel с пакетом «xlrd».

На мой взгляд, самым простым решением для ссылки на названия стран с их соответствующими значениями является объединение ваших «циклов». Вместо того, чтобы дважды перебирать ваши данные (в двух отдельных «для циклов») и создавать два отдельных списка, используйте один «цикл» и создайте словарь с соответствующими данными (например, «имя страны», «hdi»). Вы также можете создать кортеж (как упоминалось ранее), но я думаю, что словари более явны.

myfile = open("/Users/it/Desktop/Python/In-Class Programs/countries.csv", "rb") 

countries = [] 
for line in myfile: 
    country_name = line.split(",")[1] 
    value_of_interest = float(line.split(",")[3]) 
    countries.append(
     {"Country Name": country_name, 
     "Value of Interest": value_of_interest}) 

ave_value = sum([country["Value of Interest"] for country in countries])/len(countries) 
max_value = max([country["Value of Interest"] for country in countries]) 
min_value = min([country["Value of Interest"] for country in countries]) 

print "Country Average == ", ave_value 
for country in countries: 
    if country["Value of Interest"] == max_value: 
     print "Max == {country}:{value}".format(country["Country Name"], country["Value of Interest"]) 
    if country["Value of Interest"] == min_value: 
     print "Min == {country}:{value}".format(country["Country Name"], country["Value of Interest"]) 

Обратите внимание, что этот метод возвращает несколько стран, если они имеют равные минимальные/максимальные значения.

Если вы мертвы-набор на создание отдельных списков (например, текущей реализации), вы могли бы рассмотреть почтовый индекс() для подключения списков (по индексу), где

zip(countries, hdi_list) = [(countries[1], hdi_list[1]), ...] 

Например:

for country in zip(countries, hdi_list): 
    if country[1] == max_value: 
     print country[0], country[1] 

с аналогичной логикой, применяемой к минимуму и среднему значению. Этот метод работает, но менее ясен и сложнее поддерживать.

3

Вместо того, чтобы значения прямо в списке, используйте кортежи вместо этого, как это:

hdi_list.append((float(hdi), acountry[1])) 

Затем вы можете использовать вместо этого:

maxTuple = max(hdi_list) 
maxNumber = round(maxTuple[0], 2) 
maxCountry = maxTuple[1] 
+0

Что делать, если две страны имеют одинаковый максимальный уровень ИЧР? –

+0

@ RafaelBarros, если у вас есть спецификация относительно двух стран с максимальным HDI, добавьте его на свой вопрос. Вы пытались выяснить, что происходит? '' 'max ([(1, 'a'), (1, 'b'), (0, 'c')])' '' – wwii

+0

@wwii не мой вопрос, просто размышление впереди –

2

Использование модуля pandas, [4], [5] , и [6] ниже должны показывать максимальные, минимальные и средние значения соответственно. Обратите внимание, что приведенные ниже данные не соответствуют вашим требованиям для страны.

In [1]: import pandas as pd 

In [2]: df = pd.read_csv("hdi.csv") 

In [3]: df 
Out[3]: 
     Country HDI 
0   Norway 83.27 
1  Australia 80.77 
2 Netherlands 87.00 
3 United States 87.43 
4 New Zealand 87.43 
5   Canada 87.66 
6  Ireland 75.47 
7 Liechtenstein 88.97 
8  Germany 86.31 
9   Sweden 80.54 

In [4]: df.ix[df["HDI"].idxmax()] 
Out[4]: 
Country Liechtenstein 
HDI    88.97 
Name: 7, dtype: object 

In [5]: df.ix[df["HDI"].idxmin()] 
Out[5]: 
Country Ireland 
HDI   75.47 
Name: 6, dtype: object 

In [6]: df["HDI"].mean() 
Out[6]: 84.484999999999985 

Предполагая, как Liechtenstein и Germany имеют максимальные значения:

In [15]: df 
Out[15]: 
     Country HDI 
0   Norway 83.27 
1  Australia 80.77 
2 Netherlands 87.00 
3 United States 87.43 
4 New Zealand 87.43 
5   Canada 87.66 
6  Ireland 75.47 
7 Liechtenstein 88.97 
8  Germany 88.97 
9   Sweden 80.54 

In [16]: df[df["HDI"] == df["HDI"].max()] 
Out[16]: 
     Country HDI 
7 Liechtenstein 88.97 
8  Germany 88.97 

Та же логика может быть применена для минимального значения.

+0

Между тем, что вы использовали 'pandas' и' iPy', я даже не могу этого сделать. IE, ваша последняя строка ввода, 'df [df [" HDI "] == df [" HDI "]. Max()]' ... это даже действительный Python? Проверка равенства в середине индекса выглядит странно для меня ... если это не какая-то предварительная нотация среза, которую я никогда раньше не видел? Или это возможно только из-за 'iPy' и/или' pandas'? – ArtOfWarfare

+0

Это действительная нотация «pandas». В основном читается как 'get dataframe view of df, где столбец HDI df равен максимальному значению в столбце HDI df'. Что я могу сказать, 'pandas' ест CSV-обработку на завтрак. – Manhattan

Смежные вопросы