Сравнение значений в столбцах

Вопросы общего характера по ГИС и дистанционному зондированию, не связанные с конкретным ПО.
Ответить
Аватара пользователя
Pavel
Активный участник
Сообщения: 171
Зарегистрирован: 15 июл 2009, 07:45
Репутация: 7

Сравнение значений в столбцах

Сообщение Pavel » 25 мар 2013, 15:17

Доброго времени суток!

Засыпался вот на такой задачке. Имеем таблицу атрибутов с двумя полями и значениями в них:

|_id_|_vid_|
|_2__|____|
|_3__|____|
|_5__|_2__|
|_10_|_19_|
|_13_|____|
|_19_|____|
|_21_|_2__|

В поле vid значения соответсвуют значениям в id. То есть vid "ссылается" на колонку id.
Нужно найти сторки, на которые есть "ссылка" и поставить в колонку result какой-либо идентификатор соответствия (пусть будет "1").
В итоге должно получится так:
|_id_|_vid_|_result_|
|_2__|____|___1___|
|_3__|____|_______|
|_5__|_2__|___1___|
|_10_|_19_|___1___|
|_13_|____|_______|
|_19_|____|___1___|
|_21_|_2__|___1___|

Пытался сделать на питоне. Но получалось, что он сравнивал только строки.
Как такое можно реализовать?
Последний раз редактировалось Pavel 25 мар 2013, 16:12, всего редактировалось 1 раз.
Быстро, качественно, недорого - выбирайте любые два пункта...

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Сравнение значений в столбцах

Сообщение Александр Мурый » 25 мар 2013, 15:50

На всякий случай вариант на <awk>:

Код: Выделить всё

awk '{if($2 is notnull) $3 = 1; print $1,$2,$3}' table.txt
Редактор материалов, модератор форума

Аватара пользователя
Pavel
Активный участник
Сообщения: 171
Зарегистрирован: 15 июл 2009, 07:45
Репутация: 7

Re: Сравнение значений в столбцах

Сообщение Pavel » 25 мар 2013, 16:07

Да, только в таком случае, он ставит единички там, где vid<>0. А еще бы поставить единичку напротив id, на который ссылается vid. То есть, если vid = 19, то result для id = 10 и для id = 19 равно 1.
Быстро, качественно, недорого - выбирайте любые два пункта...

trir
Гуру
Сообщения: 5355
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Сравнение значений в столбцах

Сообщение trir » 25 мар 2013, 18:37

sql access

Код: Выделить всё

UPDATE test1 SET result=1
where Not (test1.vid=IsNull([test1]![vid]))

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Сравнение значений в столбцах

Сообщение Александр Мурый » 26 мар 2013, 17:52

Что-то типа того:

Код: Выделить всё


import csv

list1 = []
list2 = []
list3 = []

with open('table.txt', 'rb') as f:
reader = csv.reader(f, delimiter = ' ')
for row in reader:
if row:
col1 = row[0]
col2 = row[-1]
list1.append(col1)
list2.append(col2)
else:
pass

common = [x for x in list1 if x in list2]

with open('table.txt', 'rb') as f:
reader = csv.reader(f, delimiter = ' ')
for rows in reader:
col3 = [1 for i in common if i in rows]
list3.append(' '.join(map(str,col3[:1])))

length = len(list1)

result = open('result.txt', 'wb')
output = csv.writer(result, delimiter = '\t')

for i in range(0,length):
row = list1, list2, list3
output.writerow(row)

result.close()


На выходе:

Код: Выделить всё

2     1
3   		
5   2 1
10 19 1
13  
19    1
21  2 1
Правда, с "delimiter = ' '" (пробел) плохо работает на выходе, нужно ставить либо запятую (','), либо табуляцию ('\t').
Редактор материалов, модератор форума

Аватара пользователя
Pavel
Активный участник
Сообщения: 171
Зарегистрирован: 15 июл 2009, 07:45
Репутация: 7

Re: Сравнение значений в столбцах

Сообщение Pavel » 27 мар 2013, 12:54

Хоршее решение. Даже очень хорошее!
Пытался все это дело провернуть в Pyculator, но он все-равно упорно сравнивает по строкам... Может я чего-то не допонимаю... Или все-таки структуры массивов отличаются от того, берем ли обычный файл или таблицу атрибутов?
Чтобы не быть голословным, что пытался сделать:

Код: Выделить всё

list3 = []
row = [[ <id> ], [<vid>]]
col1 = row[0]
col2 = row[-1]
a = [x for x in col1 if x in col2]
col3 = [1 for i in a if i in row]
list3.append(' '.join(map(str,col3[:1])))

value = list3
Хотя, я так подозреваю, что можно обойтись и без первых трех строк, просто записать их как

Код: Выделить всё

col1 = [id]
col2 = [vid]
В общем, что-то я в конец запутался...
Быстро, качественно, недорого - выбирайте любые два пункта...

Ответить

Вернуться в «Общие вопросы»

Кто сейчас на конференции

Сейчас этот форум просматривают: Ahrefs [Bot] и 3 гостя