朱莉娅(Julia):如何在数据框的某些列上计算特定操作

时间:2019-07-14 16:09:15

标签: dataframe julia mean

我有以下数据框

using DataFrames, Statistics
df = DataFrame(name=["John", "Sally", "Kirk"], 
               age=[23., 42., 59.],
               children=[3,5,2], height = [180, 150, 170])

print(df)

3×4 DataFrame
│ Row │ name   │ age     │ children │ height │
│     │ String │ Float64 │ Int64    │ Int64  │
├─────┼────────┼─────────┼──────────┼────────┤
│ 1   │ John   │ 23.0    │ 3        │ 180    │
│ 2   │ Sally  │ 42.0    │ 5        │ 150    │
│ 3   │ Kirk   │ 59.0    │ 2        │ 170    │

我可以计算出列的平均值,如下所示:

println(mean(df[:4]))
166.66666666666666

现在,我想获取所有数字列的均值并尝试以下代码:

x = [2,3,4]
for i in x
  print(mean(df[:x[i]]))
end

但是收到以下错误消息:

MethodError: no method matching getindex(::Symbol, ::Int64)

Stacktrace:
 [1] top-level scope at ./In[64]:3

我该如何解决问题?

3 个答案:

答案 0 :(得分:2)

您正尝试使用指定列位置的整数索引来访问DataFrame的列。您应该只使用在:之前不带任何i的整数值,这将创建符号:i,但是您没有名为i的列。

x = [2,3,4]
for i in x
  println(mean(df[i])) # no need for `x[i]`
end

您还可以使用DataFrame表示列名来索引Symbol

x = [:age, :children, :height];

for c in x
    println(mean(df[c]))
end

由于尝试访问符号i的第:x个索引,这是未定义的操作,因此在尝试中遇到以下错误。

MethodError: no method matching getindex(::Symbol, ::Int64)

请注意,:4只是4

julia> :4
4

julia> typeof(:4)
Int64

答案 1 :(得分:2)

这里是一个单行代码,实际上选择了所有Number列:

julia> mean.(eachcol(df[findall(x-> x<:Number, eltypes(df))]))
3-element Array{Float64,1}:
  41.333333333333336
   3.3333333333333335
 166.66666666666666

在许多情况下,describe实际上更方便:

julia> describe(df)
4×8 DataFrame
│ Row │ variable │ mean    │ min  │ median │ max   │ nunique │ nmissing │ eltype   │
│     │ Symbol   │ Union…  │ Any  │ Union… │ Any   │ Union…  │ Nothing  │ DataType │
├─────┼──────────┼─────────┼──────┼────────┼───────┼─────────┼──────────┼──────────┤
│ 1   │ name     │         │ John │        │ Sally │ 3       │          │ String   │
│ 2   │ age      │ 41.3333 │ 23.0 │ 42.0   │ 59.0  │         │          │ Float64  │
│ 3   │ children │ 3.33333 │ 2    │ 3.0    │ 5     │         │          │ Int64    │
│ 4   │ height   │ 166.667 │ 150  │ 170.0  │ 180   │         │          │ Int64    │

答案 2 :(得分:0)

在这个问题上,println(mean(df[4]))也有效(而不是println(mean(df[:4])))。

因此我们可以写

x = [2,3,4]
for i in x
  println(mean(df[i]))
end

有效