首页 > 解决方案 > 如何用 Julia 中的变量模式替换 DataFrame 列中的子字符串?

问题描述

假设我有一个包含两列的 DataFrame -gibberishletter. 我想替换子字符串,gibberish以便只letter保留匹配的子字符串,例如 If gibberishis"kjkkj"letteris "j"I want gibberishto equal "jj"

DataFrame 定义为:

df = DataFrame(gibberish = ["dqzzzjbzz", "jjjvjmjjkjjjjjjj", "mmbmmlvmbmmgmmf"], letter = ["z", "j", "m"])

如果我没有letter变量并且只想要,假设“x”保持不变,我会这样做:

df.gibberish.= replace.(gibberish, r"[^x;]" => "")

这很好用,但是当我尝试做同样的事情,但将letter列作为正则表达式中的变量放入时,它就会中断。我尝试使用“正常” DataFrames.jl 方式和 DataFramesMeta.jl 快捷方式@transform

df.gibberish.= replace.(gibberish, Regex(join(["[^", letter, ";]"])) => "")

这导致错误

ERROR: UndefVarError: letter not defined

@transform方式只是没有做任何事情:

julia> @transform(df, filtered = replace(:gibberish, Regex.(join(["[^", :letter, ";]"])) => ""))
3×3 DataFrame
│ Row  │ letter │ gibberish         │ filtered          │
│      │ String │ String            │ String            │
├──────┼────────┼───────────────────┼───────────────────┤
│ 1    │ z      │ dqzzzjbzz         │ dqzzzjbzz         │
│ 2    │ j      │ jjjvjmjjkjjjjjjj  │ jjjvjmjjkjjjjjjj  │
│ 3    │ m      │ mmbmmlvmbmmgmmf   │ mmbmmlvmbmmgmmf   │

我是 Julia 的新手,我可能遗漏了一些非常基本的东西,但正确的解决方案让我无法理解。除了编写效率极低的逐行循环之外,我该如何解决这个问题?

标签: replacejulia

解决方案


replace.(gibberish, Regex(join(["[^", letter, ";]"]))

letter 在这里指的是 Julia 变量(未定义),而不是 DataFrame 的列。

你可以尝试类似的东西

Regex.(string.("[^" .* df.letter .* ";]"))

使用 DataFrame 行作为输入构造正则表达式数组。


推荐阅读