Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 24, 2016 22:20:20

goodw1n
Зарегистрирован: 2016-02-24
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Группировка по числам

Здравствуйте, начинаю знакомство с Питоном. После 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?
Заранее спасибо.

Офлайн

#2 Фев. 24, 2016 23:02:31

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Группировка по числам

Первый вариант самый очевидный, а раз вы раньше Delphi изучали, то для вас не затруднит в цикле пройтись и собрать нужные значения в список. В стандартной библиотеке есть модуль csv, он поможет корректно прочитать файл, и получить доступ к элементам.
Второй вариант это воспользоваться модулем sqlite, создать базу данных в памяти, загнать туда csv и из базы с помощью SQL делать выборки. Но это слегка так себе вариант…возможно.
Третий вариант , воспользоваться специальными пакетами для обработки данных, вполне возможно сторонний модуль pandas это умеет



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Фев. 25, 2016 02:38:53

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Группировка по числам

>>> 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)

Офлайн

#4 Фев. 25, 2016 07:07:40

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Группировка по числам

goodw1n
5 11,2 22,5
Такая радость жизни с запятыми обычно получается в Винде при скидывании данных из Экселя когда в настройках русской локали на разделитель дробной и целой части запятая. В некоторых сишных компиляторах stdlib тоже на это реагирует. Это крайне неудобно с точки зрения обработки данных (переносите файл с данными на машину с другими настройками локали и они перестают читаться). Поэтому рекомендую изменить разделитель в настройках локали.



Офлайн

#5 Фев. 27, 2016 23:24:16

goodw1n
Зарегистрирован: 2016-02-24
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Группировка по числам

Реализовал с помощью 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)
но не могу понять, как теперь сделать выборку “от и до” в этом модуле (Pandas)?

update
Вроде разобрался:
data1 = data['A'][(data['A'] >= 9.1) & (data['A'] <= 10.5)]

Отредактировано goodw1n (Фев. 28, 2016 00:20:46)

Офлайн

#6 Фев. 28, 2016 07:58:05

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Группировка по числам

goodw1n
Вроде разобрался:
& это побитовое И. Если значения True/False то это не важно, по крайней мере в текущей реализации. Однако логичнее использовать логическое and :).
http://docs.scipy.org/doc/numpy/reference/generated/numpy.logical_and.html#numpy.logical_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])

p.s.
У вас правильно сделано, это просто на будущее примечание.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version