我有一个原始数据集,有超过4,500行表示土地交易。其中一个现有列是“Place”,在每个单元格值中,我将地点名称通常设为Some Neighborhood
,但有时当有一个我不知道的地方时,我会添加其他信息公证记录,例如Some Neighborhood, Some County
或甚至Some Neighborhood, Some County (nicknamed)
。
我想使用这一列中的信息创建两个新列。第一列包含上层行政区划,第二列包含上面的行政区划 - 有点像缩小。
我想我需要使用一种逻辑测试或if-if-if-test创建一个基于现有列的新列,我可以枚举属于Some Neighborhood
的{{1}}值或者County 1
或County 2
等等。然后,根据这个新专栏,我会创建另一个包含City 1
,State 1
等的内容,大概使用同样的考试。
我如何在Open Refine GREL中使用正则表达式来编写它?如何将多个可能的值串在一起?我尝试使用State 2
和cells
,但我不知道如何将这样的倍数串起来。
再次回顾一下,我想编写一种方法来创建一个新列,该列包含基于现有值列的新单元格值,例如
“ if value.contains
,Street1
,Street2
但 Street5,
或Street3
,然后 Street4
“
OR
“ if County1
或Street1
或Street2
然后 Street5,
然后如果 County1
或Street3
然后 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)
答案 0 :(得分:1)
有多种方法,您选择的方法可能取决于初始位置列中的值。
我建议将第一种方法作为起点
方法1 - 使用方面:
方法2 - 使用查找: 如果您有地图的映射 - >公社&部分已经,您可以将其创建为单独的OpenRefine项目,然后使用“交叉”查找每个地方的公社/部分
cell.cross('place mapping project','Place')[0].cells["Commune"].value
cell.cross('place mapping project','Place')[0].cells["Section"].value
方法3 - 使用条件: 这是我认为你首先要求的方法,但我认为这不一定是最好的选择
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")
答案 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"
然后使用||拆分新列作为分隔符(见截屏视频)。
您当然可以使用括号和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"