Создать столбец в 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"
Другие вопросы по тегам