OpenRefine:用递增的计数器向下填充
OpenRefine: Fill down with increasing counter
在 OpenRefine 中是否可以用计数器填充空白单元格而不是复制顶部的非空白值?
在此示例图片中:
或者这里是与键入的文本相同的示例 - 将此图像作为从上到下的一列:
1
1
blank
1
blank
blank
blank
blank
blank
1
我希望看到该列填充如下(同样,想象从上到下):
1
1
2
1
2
3
4
5
6
1
谢谢,非常感谢帮助。
真的不简单。你必须:
1 将空格替换为其他内容,例如 "x"
2 为整个数据集创建唯一记录
3 使用这个 Jython 脚本:
import itertools
data = row['record']['cells']['YOUR COLUMN NAME']['value']
x = itertools.count(2)
liste = []
for i, el in enumerate(data):
if data[i] == "x":
liste.append(x.next())
else:
x = itertools.count(2)
liste.append(el)
return ",".join([str(x) for x in liste])
4 使用空白向下清除重复项
5 拆分第一个多值单元格。
这是上述操作的截屏视频。
如果您知道一点 Python,您也可以使用 pandas
转换您的文件。我不知道最优雅的方法是什么,但这个脚本应该可以。
import itertools
import pandas as pd
x = itertools.count(2)
def set_x():
global x
x = itertools.count(2)
set_x()
def increase(value):
if not value:
return next(x)
else:
set_x()
return value
data = pd.read_csv("your_file.csv", na_values=['nan'], keep_default_na=False)
data['column 1'] = data['column 1'].apply(lambda row: increase(row))
print(data)
data.to_csv("final_file.csv")
这里有两个使用 GREL 的简单解决方案。
使用记录
您可以将列移到开头,告诉 OpenRefine 使用数字作为记录。您可能需要将列转换为文本以真正说服 OpenRefine 将其用作记录。
然后添加一个新列或使用以下表达式转换现有列。
1 + row.index - row.record.fromRowIndex
使用记录标记
如果您不想使用记录或没有静态号码,您可以创建类似的设置。假设您有一个不完整的计数器,如下面的 table 并想要填充它。
Origin
Desired
1
1
2
1
1
2
2
3
1
1
要填充缺失的单元格,首先使用以下表达式在原始列的基础上添加一个新列并将其命名为 record_row_index.
if(isNonBlank(value), row.index, "")
之后fill down原始列和新列record_row_index.
然后使用以下表达式在原始填充列的基础上创建一个新列。
value + row.index - cells["record_row_index"].value
提示: 表达式要求两列均为数字类型。
如果其中之一是文本类型,您可以预先转换列或在表达式中使用 toNumber()。
以下 table 显示了这些操作如何协同工作。
Origin
Origin filled
row.index
record_row_index
Desired
1
1
0
0
1 + 0 - 0 = 1
1
1
0
1 + 1 - 0 = 2
1
1
2
2
1 + 2 - 2 = 1
2
2
3
3
2 + 3 - 3 = 2
2
4
3
2 + 4 - 3 = 3
1
1
5
5
1 + 5 - 5 = 1
在 OpenRefine 中是否可以用计数器填充空白单元格而不是复制顶部的非空白值?
在此示例图片中:
或者这里是与键入的文本相同的示例 - 将此图像作为从上到下的一列:
1
1
blank
1
blank
blank
blank
blank
blank
1
我希望看到该列填充如下(同样,想象从上到下):
1
1
2
1
2
3
4
5
6
1
谢谢,非常感谢帮助。
真的不简单。你必须:
1 将空格替换为其他内容,例如 "x"
2 为整个数据集创建唯一记录
3 使用这个 Jython 脚本:
import itertools
data = row['record']['cells']['YOUR COLUMN NAME']['value']
x = itertools.count(2)
liste = []
for i, el in enumerate(data):
if data[i] == "x":
liste.append(x.next())
else:
x = itertools.count(2)
liste.append(el)
return ",".join([str(x) for x in liste])
4 使用空白向下清除重复项
5 拆分第一个多值单元格。
这是上述操作的截屏视频。
如果您知道一点 Python,您也可以使用 pandas
转换您的文件。我不知道最优雅的方法是什么,但这个脚本应该可以。
import itertools
import pandas as pd
x = itertools.count(2)
def set_x():
global x
x = itertools.count(2)
set_x()
def increase(value):
if not value:
return next(x)
else:
set_x()
return value
data = pd.read_csv("your_file.csv", na_values=['nan'], keep_default_na=False)
data['column 1'] = data['column 1'].apply(lambda row: increase(row))
print(data)
data.to_csv("final_file.csv")
这里有两个使用 GREL 的简单解决方案。
使用记录
您可以将列移到开头,告诉 OpenRefine 使用数字作为记录。您可能需要将列转换为文本以真正说服 OpenRefine 将其用作记录。 然后添加一个新列或使用以下表达式转换现有列。
1 + row.index - row.record.fromRowIndex
使用记录标记
如果您不想使用记录或没有静态号码,您可以创建类似的设置。假设您有一个不完整的计数器,如下面的 table 并想要填充它。
Origin | Desired |
---|---|
1 | 1 |
2 | |
1 | 1 |
2 | 2 |
3 | |
1 | 1 |
要填充缺失的单元格,首先使用以下表达式在原始列的基础上添加一个新列并将其命名为 record_row_index.
if(isNonBlank(value), row.index, "")
之后fill down原始列和新列record_row_index.
然后使用以下表达式在原始填充列的基础上创建一个新列。
value + row.index - cells["record_row_index"].value
提示: 表达式要求两列均为数字类型。 如果其中之一是文本类型,您可以预先转换列或在表达式中使用 toNumber()。
以下 table 显示了这些操作如何协同工作。
Origin | Origin filled | row.index | record_row_index | Desired |
---|---|---|---|---|
1 | 1 | 0 | 0 | 1 + 0 - 0 = 1 |
1 | 1 | 0 | 1 + 1 - 0 = 2 |
|
1 | 1 | 2 | 2 | 1 + 2 - 2 = 1 |
2 | 2 | 3 | 3 | 2 + 3 - 3 = 2 |
2 | 4 | 3 | 2 + 4 - 3 = 3 |
|
1 | 1 | 5 | 5 | 1 + 5 - 5 = 1 |