0

我有一个原始数据集,其中包含代表土地交易的 4,500 多个行条目。现有列之一是“地点”,在每个单元格值中,我通常将地点名称设为Some Neighborhood,但有时当有一个我不知道的地点时,我会从公证记录中添加其他信息,例如,Some Neighborhood, Some County甚至作为Some Neighborhood, Some County (nicknamed)

我想使用这一列中的信息创建两个新列。第一列将包含上级行政区划,第二列包含上级行政区划——有点像缩小。

我想我需要使用某种逻辑测试或 if-if-if-test 基于现有列创建一个新列,在其中我可以枚举Some Neighborhood属于County 1or County 2orCity 1等​​的值。然后,基于这个新列,我会创建另一个具有State 1,State 2等的,大概使用相同类型的测试。

我将如何在 Open Refine GREL 中使用正则表达式来编写它?如何将在单元格中找到的多个可能值串在一起?我尝试使用cellsvalue.contains但我不知道如何将这样的倍数串在一起。

所以再次回顾一下,我想编写一种方法来创建一个新列,该列包含基于现有值列的新单元格值,例如

如果 Street1, Street2,Street5, 但不是 Street3, 或Street4,那么 County1

或者

如果 Street1Street2Street5, 然后 County1 AND THEN 如果 Street3Street4 然后 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)

下面是一个带有两个新列的预期结果示例,比如说“Commune”和“Section”:

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

2 回答 2

1

有多种方法,您选择的方法可能取决于您在初始 Place 列中有多少值。

我推荐第一种方法作为起点

方法 1 - 使用方面:

  • a) 添加空白列(例如 Commune、Section)(通过使用任何现有列中的“基于此列添加列”并使用“null”作为 GREL 公式来执行此操作)
  • b) 在 Place 列上分面,在同一 Commune 和 Section 中选择一组值(例如“Bullet”、“Campéche”、“Bremont”等),然后编写公式以使用“Bwadlans”更新 Commune 和 Section 列,然后'柠檬水'
  • c) 对具有一组地点的每个公社/部分重复

方法 2 - 使用查找: 如果您已经有 Places -> Commune & Sections 的映射,您可以将其创建为单独的 OpenRefine 项目,然后使用“cross”为每个 Place 查找 Commune/Section

  • a) 创建带有 Place、Commune 和 Section 列的 OpenRefine 项目(每个地方一行)
  • b) 在初始项目中,使用 GREL 基于 Place 列创建一个新列,例如:cell.cross('place mapping project','Place')[0].cells["Commune"].value
  • c) 重复 (b) 但对于 Section 值,例如cell.cross('place mapping project','Place')[0].cells["Section"].value

方法 3 - 使用条件: 我认为这是您首先要求的方法,但我认为它不一定是最佳选择

  • a) 使用任何 Place 列中的“基于此列添加列”,使用类似 GRELif(or(value=="Bullet",value=="Campéche"),"Bwadlans","")
  • b)对于其他位置,您可以通过引用 Place 列中的值在新列上编写类似的 GREL - 例如if(or(cells["Place"].value=="Pierrette",cells["Place"].value=="Lagenivrée"),"Roucou")

请注意,要使用两个以上的条件,您必须嵌套“或”语句,例如: or(or(value=="Bullet",value=="Campéche"),value=="Bremont")

方法 2 和 3 可以通过安装有助于此过程的 OpenRefine 扩展变得更容易(推荐方法 2 的 VIB-BITS 扩展,并使用方法 3 的“inArray”功能查看 gokbutils 扩展 - 这将避免复杂的“或'语句)

于 2017-09-15T16:09:04.973 回答
0

正如您在 Owen 的回答(方法 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"
于 2017-09-15T20:41:37.317 回答