Найти строки, в которых заданы значения столбцов (аналогично pandas isin или R% в%) - PullRequest
0 голосов
/ 02 октября 2018
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 голосов
/ 03 октября 2018

Вы можете использовать функцию findin.

iris[findin(iris[:Species],["setosa","virginica"]),:]

Обратите внимание, что если вы хотите использовать findin для поиска только одного значения, оно всегда должно быть массивом, как

iris[findin(iris[:Species],["setosa"]),:]
0 голосов
/ 05 октября 2018

Чтобы достичь этого, используйте findall:

iris[findall(in(["setosa", "virginica"]), iris.Species), :]
0 голосов
/ 02 октября 2018
iris[ in.(iris[:Species],(["virginica","setosa"],)),: ]

Дополнительные tuple вокруг ["virginica","setosa"] позволяют избежать трансляции по списку поиска.

...