使用数据框列时 vaex apply 不起作用

vaex apply does not work when using dataframe columns

我正在尝试为维基百科中的第一句话标记自然语言,以便找到 'is a' 模式。下一步是标记的 n-gram 和遗留的文本。 “惠灵顿是英国的一个小镇。”变成“towncountry 中的 attr_root。”然后使用 n-gram 找到常见模式。

为此,我需要使用数据框中的其他字符串列替换字符串列中的字符串值。在 Pandas 中,我可以使用

来做到这一点
df['Test'] = df.apply(lambda x: x['Name'].replace(x['Rep'], x['Sub']), axis=1)

但我找不到等效的 vaex 方法。 This 问题让我相信,根据 Maarten Breddels 的示例代码,这在 vaex 中应该是可能的,但是在尝试时我得到以下错误。

import pandas as pd
import vaex

df = pd.DataFrame(
    {
        "Name": [
            "Braund, Mr. Owen Harris",
            "Allen, Mr. William Henry",
            "Bonnell, Miss. Elizabeth",
        ],
        "Rep": ["Braund", "Henry", "Miss."],
        "Sub": ["<surname>", "<name>", "<title>"],
    }
)
dfv = vaex.from_pandas(df)

def func(x, y, z):
    return x.replace(y, z)

dfv['Test'] = dfv.apply(func, arguments=[df.Name.astype('str'), df.Rep.astype('str'), df.Sub.astype('str')])

给予

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\User\AppData\Roaming\Python\Python37\site-packages\vaex\dataframe.py", line 455, in apply
    arguments = _ensure_strings_from_expressions(arguments)
  File "C:\Users\User\AppData\Roaming\Python\Python37\site-packages\vaex\utils.py", line 780, in _ensure_strings_from_expressions
    return [_ensure_strings_from_expressions(k) for k in expressions]
  File "C:\Users\User\AppData\Roaming\Python\Python37\site-packages\vaex\utils.py", line 780, in <listcomp>
    return [_ensure_strings_from_expressions(k) for k in expressions]
  File "C:\Users\User\AppData\Roaming\Python\Python37\site-packages\vaex\utils.py", line 782, in _ensure_strings_from_expressions
    return _ensure_string_from_expression(expressions)
  File "C:\Users\User\AppData\Roaming\Python\Python37\site-packages\vaex\utils.py", line 775, in _ensure_string_from_expression
    raise ValueError('%r is not of string or Expression type, but %r' % (expression, type(expression)))
ValueError: 0     Braund, Mr. Owen Harris
1    Allen, Mr. William Henry
2    Bonnell, Miss. Elizabeth
Name: Name, dtype: object is not of string or Expression type, but <class 'pandas.core.series.Series'>

如何在 vaex 中完成此操作?

原来我有一个错误。在对 apply 的调用中需要 dfv 而不是 df.

还从 vaex 的好人那里得到了这个更快的方法。

import pyarrow as pa
import pandas as pd
import vaex

df = pd.DataFrame(
    {
        "Name": [
            "Braund, Mr. Owen Harris",
            "Allen, Mr. William Henry",
            "Bonnell, Miss. Elizabeth",
        ],
        "Rep": ["Braund", "Henry", "Miss."],
        "Sub": ["<surname>", "<name>", "<title>"],
    }
)
dfv = vaex.from_pandas(df)


@vaex.register_function()
def replacer(x, y, z):
    res = []
    for i, j, k in zip(x.tolist(), y.tolist(), z.tolist()):
        res.append(i.replace(j, k))
    return pa.array(res)

dfv['Test'] = dfv.func.replacer(dfv['Name'], dfv['Rep'], dfv['Sub'])