Добавление значений из файла CSV

1

Я начинаю изучать Python и борюсь с синтаксисом.

У меня есть простой файл CSV, который выглядит следующим образом

0.01,10,20,0.35,40,50,60,70,80,90,100
2,22,32,42,52,62,72,82,92,102,112
3,33,43,53,63,5647,83,93,103,113,123

Я хочу найти самое высокое и самое низкое значение во всех данных в файле CSV, за исключением первого значения каждой строки.

Таким образом, ответ здесь будет

highestValue=5647
lowestValue=0.35

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

10,20,0.35,40,50,60,70,80,90,100
22,32,42,52,62,72,82,92,102,112
33,43,53,63,73,5647,93,103,113,123

Я хотел бы, чтобы мой код работал для любой длины строки.

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

import numpy

test_data_file = open ("Anaconda3JamesData/james_test_3.csv","r")
test_data_list = test_data_file.readlines()
test_data_file.close()

for record in test_data_list:
    all_values = record.split(',')
    maxvalue = np.max(numpy.asfarray(all_values[1:])

print (maxvalue)

С данными теста (файл CSV, показанный в самом верху этого вопроса), я ожидаю, что ответ будет

highestValue=5647
lowestValue=0.35
Теги:

6 ответов

1

Если вы используете numpy, вы можете прочитать ваш csv файл как numpy.ndarray используя numpy.genfromtxt() а затем использовать .max() массива .max() и .min()

import numpy
array = numpy.genfromtxt('Anaconda3JamesData/james_test_3.csv', delimiter=',')
array[:, 1:].max()
array[:, 1:].min()

Часть [:, 1:] использует индексирование массивов. В нем говорится, что берут все строки (первый [:, часть), а для каждой строки берут все, кроме первого столбца (часть 1:]). Это не работает со встроенными списками Python.

0

Вы перезаписываете maxvalue каждый раз в цикле, так что вы просто получаете максимальное значение из последней строки, а не из всего файла. Вам нужно сравнить с предыдущим максимумом.

maxvalue = None
for record in test_data_list:
    all_values = record.split(',')
    if maxvalue is None:
        maxvalue = np.max(numpy.asfarray(all_values[1:])
    else:
        maxvalue = max(maxvalue, np.max(numpy.asfarray(all_values[1:]))
0

Вам не нужна сила numpy для этой проблемы. Простой читатель CSV достаточно хорош:

with open("Anaconda3JamesData/james_test_3.csv") as infile:
    r = csv.reader(infile)
    rows = [list(map(float, line))[1:] for line in r]
max(map(max, rows))
# 5647.0
min(map(min, rows))
# 0.35
0

Я думаю, что использование numpy не требуется для этой задачи. Прежде всего это:

test_data_file = open ("Anaconda3JamesData/james_test_3.csv","r")
test_data_list = test_data_file.readlines()
test_data_file.close()

for record in test_data_list:

можно упростить до этого:

with open("Anaconda3JamesData/james_test_3.csv","r") as test_data_file:
    for record in test_data_file:

Мы можем использовать понимание списка, чтобы прочитать все значения:

with open("Anaconda3JamesData/james_test_3.csv","r") as test_data_file:
    values = [float(val) for line in test_data_file for val in line.split(",")[1:]]

values теперь содержат все соответствующие числа, поэтому мы можем просто сделать:

highest_value = max(values)
lowest_value = min(values)
  • 0
    Вы должны использовать csv для чтения CSV.
  • 0
    @ Борис Это правда, но для такой простой проблемы это не нужно.
0

Вот решение для pandas которое может дать желаемые результаты:

import pandas as pd
df = pd.read_csv('test1.csv', header=None)
# df:
#    0     1   2      3   4     5   6   7    8    9    10
# 0  0.01  10  20   0.35  40    50  60  70   80   90  100
# 1  2.00  22  32  42.00  52    62  72  82   92  102  112
# 2  3.00  33  43  53.00  63  5647  83  93  103  113  123

df = df.iloc[:, 1:] 
print("Highest value: {}".format(df.values.max()))
print("Lowest value: {}".format(df.values.min()))
#Output:
Highest value: 5647.0
Lowest value: 0.35
-1

попробуй это:

    file = open("Anaconda3JamesData/james_test_3.csv","r")
    data = file.read() 
    data = data.split('\n') 
    data = "".join(data) 
    data = data.split('\,') 
    datanew = [] 
    for num in data:
        datapiece = float(num)
        datanew.append(datapiece) 
    highestValue = max(datanew) 
    lowestValue = min(datanew)
    '''

Ещё вопросы

Сообщество Overcoder
Наверх
Меню