OpenRefine: заполнить с увеличивающимся счетчиком

Возможно ли в OpenRefine заполнить пустые ячейки счетчиком вместо копирования верхнего непустого значения?

В этом примере изображения:

пример открытого столбца уточнения, в котором некоторые ячейки заполнены 1, а другие - пробелами

Или вот тот же пример, что и набранный текст - изобразите это как столбец сверху вниз:

1
1
blank
1
blank
blank
blank
blank
blank
1

Я хотел бы, чтобы столбец был заполнен следующим образом (снова представьте, сверху вниз):

1
1
2
1
2
3
4
5
6
1

Спасибо, помощь очень ценится.


person Eduard Geist    schedule 17.11.2017    source источник


Ответы (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 Используйте Blank down, чтобы удалить дубликаты

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")
person Ettore Rizza    schedule 17.11.2017
comment
Спасибо. Опция OpenRefine, приведенная выше, кажется, не совсем выполняет то, что я хотел. Насколько я могу судить, он заполняет значения не увеличивающимся счетчиком. Например, если у меня есть 5 пустых ячеек, я хочу, чтобы они были заполнены 2,3,4,5,6, а не 1,2,3,1,2. Я мог бы просто сделать это на Python или R, как вы предлагаете. Спасибо. - person Eduard Geist; 18.11.2017
comment
@EduardGeist Это именно то, что он делает: первая ячейка x заменяется на 2, вторая на 3 и так далее. И счетчик сбрасывается до двух каждый раз, когда появляется 1, точно так же, как в вашем примере. - person Ettore Rizza; 18.11.2017
comment
Извини, да! Спасибо, что разобрались с этим. - person Eduard Geist; 18.11.2017
comment
Пожалуйста. Не стесняйтесь принять ответ, если он сработает и нет лучшего решения. - person Ettore Rizza; 19.11.2017
comment
Отличный ответ, Этторе! Будет более простой способ с невыпущенной версией OpenRefine (пока недоступной в 3.4.1). Вы сможете использовать cross() для получения предыдущей строки, тогда это будет всего лишь вопрос if previousRow = 1 { return 2 } else { return previousRow + 1 } (псевдокода). См. github.com/OpenRefine/OpenRefine/issues/. - person Vitor Baptista; 29.10.2020