如何基于字符串列连接两个DataFrame并忽略重音与变音符号?
解决带重音字符串的DataFrame连接问题
这个问题在处理多来源字符串数据时太常见了——变音符号编码不一致确实会把连接操作搞砸。好在Julia里有几种简单的方法来解决这个问题,核心思路就是把带重音的字符串转换成「ASCII等价形式」,让基础字符匹配上就行。
方法一:用内置Unicode工具手动去除重音
Julia的标准库已经提供了Unicode标准化的功能,我们可以用它来剥离变音符号:
首先定义一个去除重音的函数:
function strip_accents(s::AbstractString) # NFKD范式会把带重音的字符分解成基础字符+变音标记 normalized = normalize(s, :NFKD) # 移除所有非间距标记(也就是各种重音、变音符号) return replace(normalized, r"\p{Mn}" => "") end
接下来处理你的DataFrame,生成去除重音后的辅助列,再进行连接:
using DataFrames # 你的原始数据 fips = DataFrame(muni=["Adjuntas", "Anasco", "Bayamon", "Mayaguez"], fips=[72001, 72011, 72021, 72097]) pops = DataFrame(muni=["Adjuntas", "Añasco", "Bayamón", "Mayagüez"], pop=[17363, 26161, 169269, 71530]) # 给pops添加去除重音后的列 pops_clean = transform(pops, :muni => strip_accents => :muni_clean) # 基于清洗后的列做左连接 result = leftjoin(pops_clean, fips; on=[:muni_clean => :muni])
如果你想更稳妥,也可以同时清洗两个DataFrame的列再连接,避免其中某一侧隐藏的重音问题:
fips_clean = transform(fips, :muni => strip_accents => :muni_clean) pops_clean = transform(pops, :muni => strip_accents => :muni_clean) result = leftjoin(pops_clean, fips_clean; on=:muni_clean)
方法二:用专用包简化操作
如果你不想自己写函数,可以用StrippingAccents.jl这个专门处理重音剥离的包,它提供了开箱即用的strip_accents函数:
首先安装并加载包:
using Pkg Pkg.add("StrippingAccents") using StrippingAccents, DataFrames
然后直接清洗列并连接:
pops_clean = transform(pops, :muni => strip_accents => :muni_clean) result = leftjoin(pops_clean, fips; on=[:muni_clean => :muni])
进阶:直接在连接时处理(无需额外列)
如果不想生成辅助列,也可以在连接的on参数中直接指定处理逻辑,不过这种方式在大数据集上效率会稍低(因为每行都会重复处理):
result = leftjoin(pops, fips; on = (x -> strip_accents(x.muni)) => (y -> strip_accents(y.muni)))
不管用哪种方法,最终都能让Añasco匹配Anasco、Bayamón匹配Bayamon,完美完成左连接。
内容的提问来源于stack exchange,提问作者mbauman
相关产品推荐
相关产品推荐

