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