2 votes

Recherche d'indices dans un dataframe avec plusieurs conditions avec la fonction findall()

Sur Julia 1.3

Comment est-il possible de rechercher des éléments dans un dataframe avec plusieurs conditions. Voici un exemple avec le iris.csv (téléchargeable aquí )

df = CSV.read(".../iris.csv");
df[1:6,:]

6 rows × 5 columns
    sepal_length    sepal_width petal_length    petal_width 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

Disons que je veux sélectionner les indices des lignes dont la longueur des sépales est égale à 5.1 :

findall(df[:,1] .== 5.1)

9-element Array{Int64,1}:
  1
 18
 20
 22
 24
 40
 45
 47
 99

Même chose maintenant avec la sélection des indices avec l'espèce "setosa" :

findall(df[:,5] .== "setosa")[1:10]
10-element Array{Int64,1}:
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10

Disons maintenant que je veux sélectionner les indices des lignes dont la longueur des sépales est égale à 5.1 ET l'espèce "setosa" (j'ai essayé une syntaxe similaire à celle de la fonction which() en R ):

findall(df[:,1] .== 5.1 & df[:,5] .== "setosa")

MethodError: no method matching &(::Float64, ::PooledArrays.PooledArray{String,UInt32,1,Array{UInt32,1}})
Closest candidates are:
  &(::Any, ::Any, !Matched::Any, !Matched::Any...) at operators.jl:529

Stacktrace:
 [1] top-level scope at In[149]:1

Quelle commande dois-je utiliser à la place ?

4voto

crstnbr Points 5203

Vous devez diffuser le & (notez les parenthèses et le point avant l'opérateur & ),

findall((df[:,1] .== 5.1) .& (df[:,5] .== "setosa"))

Notez toutefois que df[:,1] .== 5.1 y df[:,5] .== "setosa" tous deux allouent des tableaux temporaires. Pensez à utiliser la version de findall qui prend une fonction comme premier argument comme ceci :

findall(x -> x.sepal.length == 5.1 && x.species == "setosa", eachrow(df))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X