Добавьте новый столбец в Python DataFrame с помощью switch-case, например, regEx

Я предполагаю, что некоторые сайты используют прототип. DOM document.getElementsByClassName() возвращает NodeList, тогда как document.getElementsByClassName() прототипа возвращает Array, потому что NodeList s не может быть создан JS-скриптами.

В Firefox вы можете использовать

var node = document;
Components.lookupMethod(node, 'getElementsByClassName').call(node, /* className */);

, чтобы получить исходный метод. Возможно, Google Chrome реализует нечто подобное, иначе вам не повезло. Я не мог найти ничего (2 мин. Googling).

В этом случае вы можете использовать что-то вроде этого:

function getElementsByClassName(node, className) {
    var rv = new Array();
    var nodeList = node.getElementsByTagName('*');
    className = className.replace(/([\.\\\\\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:\-])/, '\\$1');
    var regex = new RegExp('(?:^|[\\n\\r ])' + className + '(?:[\\n\\r ]|$)');
    for(var length = nodeList.length, i = 0; i < length; ++i) {
        if(regex.test(nodeList[ i ].className)) {
            rv.push(nodeList[ i ]);
        }
    }
    return rv;
}

Если Google Chrome реализует node.classList, вы можете использовать следующая функция, которая не использует жуткое регулярное выражение:

function getElementsByClassName(node, className) {
    var rv = new Array();
    var nodeList = node.getElementsByTagName('*');
    for(var length = nodeList.length, i = 0; i < length; ++i) {
        if(nodeList[ i ].classList.contains(className)) {
            rv.push(nodeList[ i ]);
        }
    }
    return rv;
}

Эта функция выполняет итерацию по всем элементам внутри данного узла. Он возвращает Array как Prototype и имеет тот же недостаток: массивы не «живут», как NodeList s.

0
задан Ragnar 27 February 2019 в 17:19
поделиться

1 ответ

Я наконец-то узнал, как это сделать с df.apply() благодаря этому посту: Как применить функцию к двум столбцам Pandas dataframe

data_to_df.py

[ 110]

wrangle_data.py

class WrangleData:

    ...

    def regex_canaux(self, df):
        if df['medium'] == "(NONE)":
            return "Direct"
        elif df['medium'] == "(NOT SET)":
            return "BAR"
        elif re.match("(.*)app_id=cpcg$", df['landingPage']):
            return "SEA"
        else:
            return "FOO"

Затем после print(df.head()) я получил:

        date          medium  sessions groupe_canaux
0 2019-02-25          (NONE)     11173        Direct
1 2019-02-25       (NOT SET)        12           BAR
2 2019-02-25  ABTESTING-HOME       126           FOO
3 2019-02-25       AFFILIATE         1           FOO
4 2019-02-25         ANNONCE         1           FOO
0
ответ дан Ragnar 27 February 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: