查找设置了列值的行(类似于pandas isin或R%in%)

时间:2018-10-02 11:52:49

标签: dataframe julia

using CSV, DataFrames
iris = CSV.read(joinpath(dirname(pathof(DataFrames)),"..","test/data/iris.csv"))

head(iris)
6×5 DataFrame
│ Row │ SepalLength │ SepalWidth │ PetalLength │ PetalWidth │ Species │
│     │ Float64⍰    │ Float64⍰   │ Float64⍰    │ Float64⍰   │ String⍰ │
├─────┼─────────────┼────────────┼─────────────┼────────────┼─────────┤
│ 1   │ 5.1         │ 3.5        │ 1.4         │ 0.2        │ setosa  │
│ 2   │ 4.9         │ 3.0        │ 1.4         │ 0.2        │ setosa  │
│ 3   │ 4.7         │ 3.2        │ 1.3         │ 0.2        │ setosa  │
│ 4   │ 4.6         │ 3.1        │ 1.5         │ 0.2        │ setosa  │
│ 5   │ 5.0         │ 3.6        │ 1.4         │ 0.2        │ setosa  │
│ 6   │ 5.4         │ 3.9        │ 1.7         │ 0.4        │ setosa  │

我想找到“ setosa”或“ virginica”中“种类”的所有行。请注意,答案必须使用对值数组的查找来查找,因为我希望结果在查找任意多个值时都有效。


有一个名为indexin的函数。它使我半途而废:

iris[indexin(iris.Species ,["setosa", "virginica"])]

但是当我尝试将其用于索引时,结果是:

ERROR: ArgumentError: Only Integer values allowed when indexing by vector of numbers

3 个答案:

答案 0 :(得分:2)

iris[ in.(iris[:Species],(["virginica","setosa"],)),: ]

tuple周围附加了["virginica","setosa"],可以避免在搜索列表中进行广播。

答案 1 :(得分:1)

一种实现方法是使用findall

iris[findall(in(["setosa", "virginica"]), iris.Species), :]

答案 2 :(得分:0)

您可以使用{'foo': 'bar', 'baz': 'buff', '+<': 'other/file.yaml', 'special': 'value'} 函数。

findin

请注意,如果要使用iris[findin(iris[:Species],["setosa","virginica"]),:] 仅搜索一个值,则该值必须始终是一个数组,例如

findin