Форум сайта python.su
0
Здравствуйте, начинаю знакомство с Питоном. После Delphi всё, конечно, очень не понятно. Поэтому прошу помочь решить следующую задачу:
есть csv формата
id a1 a2
1 0,1 1,2
2 9,2 5
3 10 20
4 11 21
5 11,2 22,5
Вопрос - как группировать числа из а1 и а2? Допустим, нужно получить все элементы, в которых а1 = от 9,1 до 10,5?
Заранее спасибо.
Офлайн
221
Первый вариант самый очевидный, а раз вы раньше Delphi изучали, то для вас не затруднит в цикле пройтись и собрать нужные значения в список. В стандартной библиотеке есть модуль csv, он поможет корректно прочитать файл, и получить доступ к элементам.
Второй вариант это воспользоваться модулем sqlite, создать базу данных в памяти, загнать туда csv и из базы с помощью SQL делать выборки. Но это слегка так себе вариант…возможно.
Третий вариант , воспользоваться специальными пакетами для обработки данных, вполне возможно сторонний модуль pandas это умеет
Офлайн
857
>>> import io >>> import csv >>> >>> text = """\ ... 1 0,1 1,2\r ... 2 9,2 5\r ... 3 10 20\r ... 4 11 21\r ... 5 11,2 22,5\r ... """ >>> >>> stream = io.StringIO(text) >>> >>> reader = csv.reader(stream, delimiter=' ') >>> >>> lst = list(reader) >>> lst [['1', '0,1', '1,2'], ['2', '9,2', '5'], ['3', '10', '20'], ['4', '11', '21'], ['5', '11,2', '22,5']] >>>
>>> lst = [list(s.replace(',', '.') for s in i) for i in lst] >>> lst [['1', '0.1', '1.2'], ['2', '9.2', '5'], ['3', '10', '20'], ['4', '11', '21'], ['5', '11.2', '22.5']] >>> >>> lst = [[int(i[0]), float(i[1]), float(i[2])] for i in lst] >>> lst [[1, 0.1, 1.2], [2, 9.2, 5.0], [3, 10.0, 20.0], [4, 11.0, 21.0], [5, 11.2, 22.5]] >>>
>>> sel = [i for i in lst if 9.1 <= i[1] <= 10.5] >>> sel [[2, 9.2, 5.0], [3, 10.0, 20.0]] >>>
Отредактировано py.user.next (Фев. 25, 2016 02:44:38)
Офлайн
253
goodw1nТакая радость жизни с запятыми обычно получается в Винде при скидывании данных из Экселя когда в настройках русской локали на разделитель дробной и целой части запятая. В некоторых сишных компиляторах stdlib тоже на это реагирует. Это крайне неудобно с точки зрения обработки данных (переносите файл с данными на машину с другими настройками локали и они перестают читаться). Поэтому рекомендую изменить разделитель в настройках локали.
5 11,2 22,5
Офлайн
0
Реализовал с помощью Pandas
data = read_csv('test.csv',';',index_col='Idi',thousands = '.') col = [ 'A', 'B'] data[col] = data[col].apply(lambda x: x.str.replace(".","").str.replace(",",".")) data[col] = data[col].astype(float).fillna(0.0)
data1 = data['A'][(data['A'] >= 9.1) & (data['A'] <= 10.5)]
Отредактировано goodw1n (Фев. 28, 2016 00:20:46)
Офлайн
253
goodw1n& это побитовое И. Если значения True/False то это не важно, по крайней мере в текущей реализации. Однако логичнее использовать логическое and :).
Вроде разобрался:
a=np.array([1,2,3,4,5]) b=a<3 >>> np.logical_and(a, b) array([ True, True, False, False, False], dtype=bool) >>> a & b array([1, 0, 0, 0, 0])
Офлайн