如何基于外部向量在for循环中过滤数据?代码失效问题排查
问题原因
- 遍历对象错误:你把
uni定义为单个字符串"Bob",Julia中遍历字符串会逐个取出字符,所以for nm in uni实际循环的是'B'、'o'、'b'这三个字符,而数据框里没有名字等于单个字符的行,自然得不到预期结果。 - 循环赋值覆盖:就算遍历的是正确名字,每次循环都会重新给
aa_loop赋值,最终只会保留最后一次循环的结果,无法收集所有符合条件的行(如果uni是多个名字的话)。
正确实现
情况1:uni是单个名字(无需循环)
如果只是过滤单个名字,直接用subset即可:
names = ["Sally", "Bob", "Alice", "Hank"] grades = [1, 5, 8.5, 4] aaa = DataFrame(name=names, grades=grades) uni = "Bob" aa_loop = subset(aaa, :name => ByRow(==(uni)))
情况2:uni是多个名字的向量
如果uni包含多个名字,比如uni = ["Bob", "Alice"],有两种实现方式:
方式1:循环收集结果
初始化空数据框,循环每个名字并追加符合条件的行:
names = ["Sally", "Bob", "Alice", "Hank"] grades = [1, 5, 8.5, 4] aaa = DataFrame(name=names, grades=grades) uni = ["Bob", "Alice"] aa_loop = DataFrame() for nm in uni temp = subset(aaa, :name => ByRow(==(nm))) append!(aa_loop, temp) end
方式2:向量化过滤(更高效)
用in函数直接过滤,无需循环:
names = ["Sally", "Bob", "Alice", "Hank"] grades = [1, 5, 8.5, 4] aaa = DataFrame(name=names, grades=grades) uni = ["Bob", "Alice"] aa_loop = subset(aaa, :name => ByRow(x -> x in uni)) # 简洁写法: aa_loop = subset(aaa, :name => ∈(uni))
内容的提问来源于stack exchange,提问作者awoj
相关产品推荐
相关产品推荐

