代码之家  ›  专栏  ›  技术社区  ›  grad student

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

  •  0
  • grad student  · 技术社区  · 7 年前

    Some Neighborhood ,但有时当我不知道某个地方时,我会从公证记录中添加其他信息,例如。, Some Neighborhood, Some County 或者甚至是 Some Neighborhood, Some County (nicknamed)

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

    我想我需要在现有列的基础上创建一个新列,使用一种逻辑测试或if-if测试,其中我可以枚举 一些社区 属于 County 1 County 2 City 1 等等。然后,基于这个新专栏,我将创建另一个 State 1 State 2 等等,大概使用相同的测试。

    在Open Refine GREL中如何使用正则表达式编写?如何将多个 可能的 cells value.contains 但我不知道如何像这样把倍数串起来。

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

    " 如果 Street1 Street2 , Street5, 但不是 Street3 Street4 然后 County1 "

    " 街道1 街道2 然后 国家1 然后如果 街道4 然后 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 回复  |  直到 7 年前
        1
  •  1
  •   Owen Stephens    7 年前

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

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

    • a) 添加空白列(例如Commune、Section)(使用“Add 基于此列的列'来自任何现有列,并使用 “null”为格雷尔公式)
    • b) 在“放置”列上,选择一组 同一公社和部门的价值观(例如。 “Bullet”、“Campche”、“Bremont”等),然后编写公式进行更新
    • c) 重复

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

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

    我认为这是你首先要求的方法,但我不认为这一定是最好的选择

    • a) 从任意位置列使用“基于此列添加列”,使用类GREL if(or(value=="Bullet",value=="Campéche"),"Bwadlans","")
    • 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扩展,这将避免复杂的“或”语句)

        2
  •  0
  •   Ettore Rizza    7 年前

    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"