Создать столбец в OpenRefine, используя логический тест для существующего столбца?
У меня есть исходный набор данных с более чем 4500 записей строк, представляющих сделки с землей. Один из существующих столбцов - "Место", и в каждое значение ячейки я помещаю название населенного пункта обычно как Some Neighborhood
, но иногда, когда есть место, которое я не знаю, я добавляю дополнительную информацию из записей нотариуса, например, Some Neighborhood, Some County
или даже как Some Neighborhood, Some County (nicknamed)
,
Я хочу создать два новых столбца, используя информацию из этого одного столбца. Первый столбец будет содержать административное деление верхнего уровня, а второй столбец - административное деление над ним - что-то вроде уменьшения масштаба.
Я думаю, что мне нужно будет создать новый столбец на основе существующего столбца, используя своего рода логический тест или if-if-if-test, где я могу перечислить значения Some Neighborhood
которые принадлежат County 1
или же County 2
или же City 1
и т. д. Затем, основываясь на этом новом столбце, я бы создал другой, который будет иметь State 1
, State 2
и т. д., предположительно, с использованием такого же теста.
Как бы я написал это, используя регулярные выражения в Open Refine GREL? Как объединить несколько возможных значений, которые находятся в ячейках? Я пытался с помощью cells
а также value.contains
но я не знаю, как связать кратные, как это.
Итак, еще раз напомню, я хочу написать сценарий для создания нового столбца, который содержит новые значения ячеек на основе столбца существующих значений, что-то вроде
"если Street1
,Street2
, Street5,
но нет Street3
, или же Street4
тогда County1
"
ИЛИ ЖЕ
"если Street1
или же Street2
или же Street5,
затем County1
И ТОГДА ЕСЛИ Street3
или же Street4
затем County2
"
РЕДАКТИРОВАТЬ: Вот некоторые из данных:
land sale 0.350 carreau 350 gourdes Bullet
land sale 1.000 carreau 700 gourdes Campèche
land sale 0.200 carreau 220 gourdes Bremont
land sale 0.500 carreau 150 gourdes Pierrette
land sale 5.000 carreau 225 gourdes Lagenivrée
land sale 0.125 carreau 200 gourdes Bullet
land sale 1.000 carreau 300 gourdes Tozin
land sale 0.125 carreau 100 gourdes Dufort
land sale 0.250 carreau 135 gourdes Charitte, Savann Brute
land sale 0.500 carreau 300 gourdes Ravines des Roches
land sale 0.500 carreau 80 gourdes Isidore (Nègre Libre)
land sale 0.500 carreau 215 gourdes Nordette (Boures)
land sale 0.250 carreau 200 gourdes Bullet (Morne Montègue)
А вот пример ожидаемого результата с двумя новыми столбцами, скажем, "Коммуна" и "Раздел":
land sale 0.350 carreau 350 gourdes Limonade Bwadlans Bullet
land sale 1.000 carreau 700 gourdes Limonade Bwadlans Campèche
land sale 0.200 carreau 220 gourdes Limonade Bwadlans Bremont
land sale 0.500 carreau 150 gourdes Limonade Roucou Pierrette
land sale 5.000 carreau 225 gourdes Limonade Roucou Lagenivrée
land sale 0.125 carreau 200 gourdes Limonade Bwadlans Bullet
land sale 1.000 carreau 300 gourdes Quart_Mor Sablé Tozin
land sale 0.125 carreau 100 gourdes Limonade Bwadlans Dufort
land sale 0.250 carreau 135 gourdes Limonade Bwadlans Charitte, Savann Brute
land sale 0.500 carreau 300 gourdes Limonade Bwadlans Ravines des Roches
land sale 0.500 carreau 80 gourdes Limonade Bwadlans Isidore (Nègre Libre)
land sale 0.500 carreau 215 gourdes Limonade Bwadlans Nordette (Boures)
land sale 0.250 carreau 200 gourdes Limonade Bwadlans Bullet (Morne Montègue)
2 ответа
Существует несколько подходов, и выбор, который вы выберете, может зависеть от того, сколько значений у вас в исходном столбце Place.
Я рекомендую первый подход в качестве отправной точки
Подход 1 - использовать грани:
- а) Добавить пустые столбцы (например, "Коммуна", "Раздел") (сделать это, используя "добавить столбец на основе этого столбца" из любого существующего столбца и используя "ноль" в качестве формулы GREL)
- b) Столбец Facet on Place, выберите набор значений в одной и той же Коммуне и Разделе (например, "Bullet", "Campéche", "Bremont" и т. д.), а затем напишите формулу для обновления столбцов Commune и Section с помощью "Bwadlans" и "Лимонад"
- в) Повторите для каждой коммуны / секции с группой мест
Подход 2 - используйте поиск: если у вас уже есть отображение мест -> Commune & Sections, вы можете создать его как отдельный проект OpenRefine, а затем использовать 'cross' для поиска сообщества / раздела для каждого места
- a) Создать проект OpenRefine со столбцами для Place, Commune и Section (одна строка на место)
- б) В начальном проекте создайте новый столбец на основе столбца Разместить с помощью GREL, например:
cell.cross('place mapping project','Place')[0].cells["Commune"].value
- в) Повторите (б), но для значения раздела, например
cell.cross('place mapping project','Place')[0].cells["Section"].value
Подход 3 - используйте условные обозначения. Я думаю, что именно такой подход вы просили в первую очередь, но я не думаю, что это обязательно лучший вариант.
- а) используя "добавить столбец на основе этого столбца" из любого столбца "Место", используйте GREL, как
if(or(value=="Bullet",value=="Campéche"),"Bwadlans","")
- b) для других мест вы можете написать аналогичный GREL в новом столбце, ссылаясь на значение в столбце Place - например,
if(or(cells["Place"].value=="Pierrette",cells["Place"].value=="Lagenivrée"),"Roucou")
Обратите внимание, что для использования более двух условий вы должны вложить операторы 'или', например:or(or(value=="Bullet",value=="Campéche"),value=="Bremont")
Подходы 2 и 3 можно упростить, установив расширения OpenRefine, которые помогают в этом процессе (рекомендуйте расширение VIB-BITS для подхода 2 и посмотрите на расширение gokbutils с функцией 'inArray' для подхода 3 - что позволит избежать сложного 'или ' заявления)
Как вы можете видеть в ответе Оуэна (подход 3), с GREL сложно справиться. Если это действительно то, что вы хотите сделать, используйте вместо этого Python/Jython. Вот пример, основанный на ваших данных:
value = value.strip().lower()
if "pierrette" in value or "lagenivrée" in value:
return "Limonade||Roucou"
elif "tozin" in value:
return "Quart_Mor||Sablé"
else:
return "Limonade||Bwadlans"
Затем просто разделите новый столбец, используя || в качестве разделителя (см. скринкаст).
Конечно, вы можете создавать более сложные условия, используя скобки и not in
,
Поддельный пример:
value = value.strip().lower()
if "pierrette" in value or "lagenivrée" in value:
return "Limonade||Roucou"
elif "tozin" in value:
return "Quart_Mor||Sablé"
elif ( ("ravinne" in value or "lagenivrée" in value)
and ("des roches" not in value or "savan" not in value)):
return "Somewhat||Somewath else"
else:
return "Limonade||Bwadlans"