Я начинаю изучать 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
Если вы используете 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.
Вы перезаписываете 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:]))
Вам не нужна сила 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
Я думаю, что использование 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)
Вот решение для 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
попробуй это:
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)
'''
csv
для чтения CSV.