使用现有列上的逻辑测试在OpenRefine中创建列?

时间:2017-09-14 19:52:43

标签: regex openrefine google-refine grel

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

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

我想我需要使用一种逻辑测试或if-if-if-test创建一个基于现有列的新列,我可以枚举属于Some Neighborhood的{​​{1}}值或者County 1County 2等等。然后,根据这个新专栏,我会创建另一个包含City 1State 1等的内容,大概使用同样的考试。

我如何在Open Refine GREL中使用正则表达式来编写它?如何将多个可能的值串在一起?我尝试使用State 2cells,但我不知道如何将这样的倍数串起来。

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

if value.containsStreet1Street2 Street5,Street3然后 Street4

OR

if County1Street1Street2 然后 Street5, 然后如果 County1Street3 然后 Street4

编辑: 以下是一些数据:

County2

以下是两个新列的预期结果示例,假设“Commune”和“Section”:

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)

2 个答案:

答案 0 :(得分:1)

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

我建议将第一种方法作为起点

方法1 - 使用方面:

  • a)添加空白列(例如Commune,Section)(使用'add 基于此列的列'来自任何现有列,并使用 'null'作为GREL公式)
  • b)Facet on Place列,选择一组 同一公社和部门的价值(例如 '子弹','坎佩切','布雷蒙特'等)然后写公式进行更新 “Bwadlans”和“Limonade”的公社和部门栏目
  • c)重复 对于每个具有一组地方的公社/部分

方法2 - 使用查找: 如果您有地图的映射 - >公社&部分已经,您可以将其创建为单独的OpenRefine项目,然后使用“交叉”查找每个地方的公社/部分

  • 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)使用任意地方列中的“根据此列添加列”,使用GREL,如if(or(value=="Bullet",value=="Campéche"),"Bwadlans","")
  • b)对于其他位置,您可以通过参考“放置”列中的值在新列上写入类似的GREL,例如if(or(cells["Place"].value=="Pierrette",cells["Place"].value=="Lagenivrée"),"Roucou")

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

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

答案 1 :(得分:0)

正如你在欧文的答案(方法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"

然后使用||拆分新列作为分隔符(见截屏视频)。

enter image description here

您当然可以使用括号和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"