2017-09-14 69 views
0

我有一个原始数据集,超过4,500行代表土地交易。其中一个现有的专栏是“Place”,并且在每个单元格值中,我通常将地区名称设置为Some Neighborhood,但有时候当有一个地方我不知道时,我会添加公证记录中的其他信息,例如Some Neighborhood, Some County或甚至Some Neighborhood, Some County (nicknamed)使用现有列上的逻辑测试在OpenRefine中创建列?

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

我想我会需要基于使用一种逻辑测试的现有列来创建新的列或如果 - 如果 - 如果 - 测试在那里我可以列举的Some Neighborhood属于County 1County 2City 1等值。然后,基于这个新的专栏,我会创建另一个有State 1,State 2等,假定使用相同的测试。

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

所以再回顾一下,我想脚本的方式来创建包含基于现有值的列新的单元格值的新列,像

如果Street1Street2Street5,但不Street3,或Street4然后County1

OR

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

这是考试有两个新列的预期结果的PLE,让我们说“公社”和“节”:

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) 
+0

你可以发布您的数据样本?开放式细化通常需要屏幕录像,使用数据要比重现它们容易得多。 –

+0

好的,添加了10行样本数据 –

+1

我不明白。你在你的帖子街区,县,街道中提到,但是你的样本数据中没有这样的内容。我的问题是,我什至不知道你想要做什么。 –

回答

1

有许多方法和你选择的一个可能取决于你有多少值都在初始地点柱。

我推荐第一种方法为起点

方法1 - 使用小面:

  • a)增加空白栏(例如Commune,Section)(通过使用'add column based on this column'from any existing column,and use 'null'as GREL formula)
  • b)Facet on Place列,选择一组 值相同公社和第(例如 “子弹”,“坎佩切”,“Bremont”等),然后写式与“Bwadlans”和“Limonade”
  • c)中重复 用于更新 公社和第列每个公社/部门有一组地方

方法2 - 使用查找: 如果你有邻居的映射 - >公社&节已经,您可以创建此作为一个单独的OpenRefine项目,然后使用“十字”查找一个公社/条每个地方

  • a)创建OpenRefine与广场,公社和第(每处一行)
  • b)列在项目的初始项目创建基于与GREL的地方列一个新的列,如:cell.cross('place mapping project','Place')[0].cells["Commune"].value
  • C)重复(b),但对于部分值例如cell.cross('place mapping project','Place')[0].cells["Section"].value

方法3 - 使用条件: 这是我想你问的第一个地方的做法,但我不认为这必然是最佳的选择

  • 一)在任何地方栏中使用'基于此列添加列',请使用GREL,如if(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扩展 - 这将避免复杂的'或'语句)

0

正如你可以在Owen的答案(方法3)中看到的那样,对于GREL来说,conditionnals是棘手的。如果这真的是你想要做的,那就用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"